POJ 2773 GCD运用

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 = =

猜你喜欢

转载自blog.csdn.net/qq_40953281/article/details/81383648
POJ