poj 2773 happy 2006
这道题目看上去不难,但我一直想不懂为什么k会比m大```
我的第一感觉想试试gcd,不敢下手,题目意思还不完全懂;
看了看网上的题解,发现大部分都是用容斥原理做,这东西我还没学, = =!
后来明白题目意思了,也就清楚了```
题解:
欧几里德算法: gcd(b×t+a,b)=gcd(a,b) (t为任意整数)
则如果a与b互素,则b×t+a与b也一定互素,如果a与b不互素,则b×t+a与b也一定不互素
故与m互素的数对m取模具有周期性,则根据这个方法我们就可以很快的求出第k个与m互素的数
1 #include<cstdio> 2 using namespace std; 3 int s[1000009]; 4 int gcd(int a,int b) 5 { 6 return b==0?a:gcd(b,a%b); 7 } 8 int main() 9 { 10 int a,b; 11 while(scanf("%d%d",&a,&b)!=EOF) 12 { 13 int j=0; 14 for(int i=1;i<=a;i++) 15 if(gcd(i,a)==1) 16 s[++j]=i; 17 if(b%j==0) 18 printf("%d\n",a*(b/j-1)+s[j]); 19 else printf("%d\n",a*(b/j)+s[b%j]); 20 } 21 return 0; 22 }