本题题意为求 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 ;
}

最新文章

  1. jdk 环境变量配置
  2. ecshop if标签,超过N条,就输出记录 elseif、库存显示方式
  3. ubuntu之使用sublime text3搭建Python IDE
  4. R语言学习笔记-变量的作用域
  5. Swift 函数
  6. 如何在eclipse jee中创建Maven project并且转换为Dynamic web project
  7. DBUtils学习
  8. MongoDB应用篇(转)
  9. VPW Communication Protocol
  10. 【C#】字符串与字符数组
  11. 使用struts2标签&lt;s:action无法显示引用页面问题
  12. Eclipse读取xml中文乱码问题解决
  13. C#多线程-volatile、lock关键字
  14. DML数据操作语言之查询(二)
  15. 贪婪算法(Greedy algorithm)-算法学习之旅(一)
  16. vue cli使用融云实现聊天
  17. C++关于string的一些用法
  18. JS查看对象属性的方式
  19. 分布式 基本理论 CAP
  20. Niagara物联网框架机制二(笔记)

热门文章

  1. 逛园子,看到个练习题,小试了一把(淘宝ued的两道小题)
  2. 《Python基础篇》之初识Python一
  3. pyspider安装后,点击run,报pyhton has stop working或python已停止运行的错误
  4. HQL和Criteria(转)
  5. HttpClient3.1设置header信息
  6. Oracle Trunc
  7. UESTC_Rain in ACStar 2015 UESTC Training for Data Structures&lt;Problem L&gt;
  8. Windows多线程同步系列之二-----关键区
  9. VBA:Google翻译(含tk算法)
  10. Unity 预处理命令