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
",a*(b/j-1)+s[j]);
19         else printf("%d
",a*(b/j)+s[b%j]);
20     }
21     return 0;
22 }
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3280179.html