POJ 2773 (っ °Д °;)っ
输入
m,k
输出
第K个与M互质的数
看一眼数据范围 暴力搜是不可能的了
但是我们发现 m的范围比较小
那么我们可不可以通过那些比m小的素数来推出其他的素数呢
也就是说这些素数具不具有周期性
需要知道
gcd(a+bt,b) = gcd(a,b)
也就是说如果i是M的一个互素的数
那么i+m*t也是满足条件的数(t是自然数)
所以我们可以找出t == 0是时候的互素序列 它就是根序列
通过它派生出其他的数
代码如下:
ps:找根序列的时候必须从[1,m] 不能[1,m)
//POJ2773
//给出m,k找出第K个和m互素的数
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = 1e6+10;
int prime[maxn];//比m小的素数
int gcd(int a,int b)
{
return b==0 ? a : gcd(b,a%b);
}
int main()
{
// freopen("./in.txt","r",stdin);
// freopen("./out.txt","w",stdout);
int m,k;
while(~scanf("%d%d",&m,&k))
{
int index = 0;
for(int i = 1;i <= m;i++)//必须<=否则RE 注意1的情况 : )
{
if(gcd(i,m) == 1) prime[index++] = i;//记录
}
//if a和b是互质那么 a+bn也与b互质 上面的就是b = 0时的情况 结果具有周期性
printf("%d\n",(k-1)/index*m + prime[(k-1)%index]);
}
return 0;
}
以此文章纪念无数的RE = =