poj 2773 容斥原理求第k个与m互质的数
2012-01-05 14:29
218 查看
二分答案,然后用容斥原理求1-mid中与m互质的个数
注意二分的上界
View Code
还有一种非常暴力的方法:只求1-m中与m互质的数,随后的互质的数就循环下去了
注意二分的上界
View Code
#include<stdio.h> #include<vector> using namespace std; int m,n; __int64 solve(int r,__int64 n){ vector<int> p; int i; for(i=2;i*i<=r;i++){ if(r%i==0){ p.push_back(i); while(r%i==0) r/=i; } } if(r>1) p.push_back(r); __int64 sum=0; for(__int64 num=1;num<(1<<p.size());num++){ __int64 mult=1,ones=0; for(i=0;i<p.size();i++){ if(num&(1<<i)){ ones++; mult*=p[i]; } } if(ones%2) sum+=n/mult; else sum-=n/mult; } return n-sum; } int main(){ int k,i,j; while(scanf("%d%d",&m,&k)!=EOF){ __int64 l=0,r=((__int64)1<<62); __int64 mid; __int64 ans=0; while(l<=r){ mid=(l+r)>>1; __int64 tmp=solve(m,mid); if(tmp>=k){ r=mid-1; if(tmp==k) ans=mid; } else l=mid+1; } printf("%I64d\n",ans); } return 0; }
还有一种非常暴力的方法:只求1-m中与m互质的数,随后的互质的数就循环下去了
#include<stdio.h> int p[1000010]; int gcd(int a,int b) { return b==0 ? a : gcd(b,a%b); } int main() { int m,k,i,j; while(scanf("%d%d",&m,&k)!=EOF) { int tot=0; for(i=1;i<=m;i++) { if(gcd(i,m)==1) { p[++tot]=i; } } int ans; int tmp=k/tot; int tmp2=k%tot; if(tmp2==0) ans=(tmp-1)*m+p[tot]; else ans=m*(tmp)+p[tmp2]; printf("%d\n",ans); } }
相关文章推荐
- poj 2773 Happy 2006(求第k个与n互质的数)
- poj 2356 Find a multiple 【抽屉原理应用】【在n个数组成的数列中找出若干个连续数使它们之和能被n整除】
- poj 2356 简单抽屉原理
- poj 2891 Strange Way to Express Integers (剩余定理~不互质)
- 容斥原理 —— 求1~n有多少个数与k互质(二进制算法详细解释&模板)
- poj2773求第K个与m互质的数
- POJ 2965 DFS解法 原理与1753类似 稍加改造即可ac
- poj2773求第K个与m互质的数
- POJ 2891 Strange Way to Express Integers 中国剩余定理MOD不互质数字方法
- POJ 1019 Number Sequence (循环递增序列的的第K个值)
- POJ 3695 容斥原理求若干矩形并 (n <= 20)
- 容斥原理求1到n与k互质个数
- poj 1019 求一个1到n的序列中,第k个数字是多少
- 容斥原理求一个数互质的数个数
- poj 2356鸽笼原理水题
- POJ 2891 Strange Way to Express Integers(非互质中国剩余定理)
- Tautology(POJ 3295编译原理)
- njust1922(容斥原理统计区间内与n互质的个数)
- POJ 2096 Collecting Bugs 概率 + markov链原理
- POJ1523(求连用分量数目,tarjan算法原理理解)