P1592 互质

题意:输入两个正整数n和k,求与n互质的第k个正整数。

$n≤10^6,k≤10^8$

 

可以枚举出互质的数,居然发现,有循环节。。。。

比如10

与其互质的1  3  7  9  11  13  17  19  21  23  27  29  31  33  37  39

卧槽循环节!!!!

循环节等于4,每个循环节的差=10(n)

因此。。。。。。

先处理1-n与n互质的

然后找到k所在循环节就行了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define int long long
#define olinr return
#define _ 0
#define love_nmr 0
#define DB double
int n;
int k;
int num;
int a[1005000];
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch=='-')
            f=-f;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
inline void put(int x)
{
    if(x<0)
    {
        x=-x;
        putchar('-');
    }
    if(x>9)
        put(x/10);
    putchar(x%10+'0');
}
signed main()
{
    n=read();
    k=read();
    for(int i=1;i<n;i++)
        if(__gcd(i,n)==1) 
            a[++num]=i;
    put((k-1)/num*n+a[(k-1)%num+1]);   //k-1/num:k所在循环节之前的循环节的个数,防止为0,因此-1再+1
    olinr ~~(0^_^0)+love_nmr;
}

 

posted @ 2018-09-01 16:53  olinr  阅读(151)  评论(0编辑  收藏  举报