标签:
友情题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3388
#include <iostream> #include <string.h> #include <algorithm> #include <stdio.h> using namespace std; typedef long long LL; const int N=1000005; const LL INF=(LL)1<<62; bool prime[N]; LL p[N]; LL f[N]; LL k,cnt,num,ans,n,m,K; void isprime()//判断素数,将素数存在数组p中 { k=0; int i,j; memset(prime,true,sizeof(prime)); for(i=2; i<N; i++) { if(prime[i]) { p[k++]=i; for(j=i+i; j<N; j+=i) { prime[j]=false; } } } } void Solve(LL m,LL n)//在已知素数组中求能被m,n整除的素数放在数组f中 { cnt=0; LL i; for(i=0; p[i]*p[i]<=n; i++) { if(n%p[i]==0) { f[cnt++]=p[i]; while(n%p[i]==0) n/=p[i]; } } if(n>1) f[cnt++]=n; for(i=0; p[i]*p[i]<=m; i++) { if(m%p[i]==0) { f[cnt++]=p[i]; while(m%p[i]==0) m/=p[i]; } } if(m>1) f[cnt++]=m; } void dfs(LL k,LL t,LL s,LL n) //????? { if(k==num) { if(t&1) ans-=n/s; else ans+=n/s; return; } dfs(k+1,t,s,n); dfs(k+1,t+1,s*f[k],n); } LL Binary() //二分查找 { LL l=1,r=INF,mid,ret; while(l<=r) { mid=(l+r)/2; ans=0; dfs(0,0,1,mid); if(ans>=K) { ret=mid; r=mid-1; } else l=mid+1; } return ret; } int main() { isprime(); LL t,ct,tt=1; scanf("%I64d",&t); while(t--) { scanf("%I64d%I64d%I64d",&m,&n,&K); printf("Case %d: ",tt++); if(n==1&&m==1) { printf("%I64d\n",k); continue; } Solve(m,n); sort(f,f+cnt);//排序 num=1; for(LL i=1; i<cnt; i++)//去重 { if(f[i]!=f[i-1]) { f[num++]=f[i]; } } ct=num; //记录下两者的因素数总数 printf("%I64d\n",Binary()); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/holyang_1013197377/article/details/47003711