fzu 1753 Another Easy Problem
2024-08-25 13:08:53
本题题意为求 t (t<150) 个 c (n,m) (1<=m<=n<=100000)的最大公因子;
本题的难点为优化。主要有两个优化重点。一是每次对单个素因子进行处理,优化每次的数组清零;二是对求阶乘素因子个数的优化
ei=[N/pi^1]+ [N/pi^2]+ …… + [N/pi^n] 其中[]为取整
ei 为数 N!中pi 因子的个数;
#include <iostream>
#include <cstring>
#include <cmath> #define maxn 100010 using namespace std; int sign[maxn];
int pri[maxn];
int tot;
int e;
int n[],k[]; void getpri (){
memset (sign,,sizeof sign);
tot=;
sign[]=sign[]=;
for (int i=;i*i<maxn;i++){
if (!sign[i]){
for (int j=i*i;j<maxn;j+=i){
sign[j]=;
}
}
}
for (int i=;i<maxn;i++){
if (!sign[i]){
pri[tot++]=i;
}
}
} int main (){
long long ans;
getpri ();
int t;
while (cin>>t){
int minnn=maxn+;
for (int i=;i<t;i++){
cin>>n[i]>>k[i];
minnn=min (minnn,n[i]);
k[i]=min (k[i],n[i]-k[i]);
}
ans=;
for (int i=;i<tot&&pri[i]<minnn;i++){ //每次处理单个素因子
e=;
int temp=;
for (int j=;j<t;j++){
temp=;
int flag=n[j];
while (flag){ //求 n! 中因子 pri(i) 的个数
temp+=flag/pri[i];
flag/=pri[i];
}
flag=k[j];
while (flag){
temp-=flag/pri[i];
flag/=pri[i];
}
flag=n[j]-k[j];
while (flag){
temp-=flag/pri[i];
flag/=pri[i];
}
e=min (e,temp);
}//cout<<e<<pri[i];
while (e--){
ans*=pri[i];
}
}
cout<<ans<<endl;
}
return ;
}
最新文章
- jdk 环境变量配置
- ecshop if标签,超过N条,就输出记录 elseif、库存显示方式
- ubuntu之使用sublime text3搭建Python IDE
- R语言学习笔记-变量的作用域
- Swift 函数
- 如何在eclipse jee中创建Maven project并且转换为Dynamic web project
- DBUtils学习
- MongoDB应用篇(转)
- VPW Communication Protocol
- 【C#】字符串与字符数组
- 使用struts2标签<;s:action无法显示引用页面问题
- Eclipse读取xml中文乱码问题解决
- C#多线程-volatile、lock关键字
- DML数据操作语言之查询(二)
- 贪婪算法(Greedy algorithm)-算法学习之旅(一)
- vue cli使用融云实现聊天
- C++关于string的一些用法
- JS查看对象属性的方式
- 分布式 基本理论 CAP
- Niagara物联网框架机制二(笔记)
热门文章
- 逛园子,看到个练习题,小试了一把(淘宝ued的两道小题)
- 《Python基础篇》之初识Python一
- pyspider安装后,点击run,报pyhton has stop working或python已停止运行的错误
- HQL和Criteria(转)
- HttpClient3.1设置header信息
- Oracle Trunc
- UESTC_Rain in ACStar 2015 UESTC Training for Data Structures<;Problem L>;
- Windows多线程同步系列之二-----关键区
- VBA:Google翻译(含tk算法)
- Unity 预处理命令