您的位置:首页 > 移动开发

poj 2773 happy 2006

2013-08-24 23:38 190 查看
这道题目看上去不难,但我一直想不懂为什么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互素的数

#include<cstdio>
using namespace std;
int s[1000009];
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
int j=0;
for(int i=1;i<=a;i++)
if(gcd(i,a)==1)
s[++j]=i;
if(b%j==0)
printf("%d\n",a*(b/j-1)+s[j]);
else printf("%d\n",a*(b/j)+s[b%j]);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: