poj 2773 Happy 2006

来源:互联网 发布:网络相关知识 编辑:程序博客网 时间:2024/05/18 00:49

http://poj.org/problem?id=2773

#include<iostream>using namespace std;#define N 1001bool h[N*N],flag[N*N];int prime[N],cnt;void init(){memset(h,false,sizeof(h));cnt=0;for(int i=2;i<N;i++){if(!h[i]){prime[cnt++]=i;for(int j=i+i;j<N;j+=i)h[j]=true;}}}int n;__int64 k;__int64 eular(int n){__int64 res=1;int nn=n;memset(flag,0,sizeof(flag));for(int i=0;i<cnt&&prime[i]*prime[i]<=n;i++){if(n%prime[i]==0){res*=prime[i]-1;n/=prime[i];while(n%prime[i]==0){res*=prime[i];n/=prime[i];}for(int j=prime[i];j<=nn;j+=prime[i])flag[j]=1;}}if(n>1){res*=n-1;for(int j=n;j<=nn;j+=n)flag[j]=1;}return res;}int get_prime(__int64 n){int cn=0;for(int i=1;i<n;i++)if(!flag[i]){cn++;if(cn==k)return i;}}int main(){__int64 PHI,base;init();while(~scanf("%d%I64d",&n,&k)){if(n==1){printf("%I64d\n",k);continue;}PHI=eular(n);base=(k-1)/PHI;k=(k-1)%PHI+1;printf("%I64d\n",n*base+get_prime(n));}}

很巧妙,网上看的。。。

原创粉丝点击