首页 > 代码库 > poj2649 数论
poj2649 数论
1 //Accepted 420K 16MS 2 //考虑 0和n! does not divide 3 // 1和0! divides 4 #include <cstdio> 5 #include <cstring> 6 #include <iostream> 7 using namespace std; 8 const int imax_n = (1<<16)+5; 9 int pri[imax_n];10 int cnt;11 void prime()12 {13 for (int i=2;i<imax_n;i++)14 {15 if ((long long )i*i<(long long )imax_n)16 for (int j=i*i;j<imax_n;j+=i)17 {18 pri[j]=1;19 }20 }21 cnt=0;22 for (int i=2;i<imax_n;i++)23 if (pri[i]==0)24 pri[cnt++]=i;25 }26 int getNumber(int n,int k)27 {28 int ans=0;29 if (k==0) return -1;30 while (n>0)31 {32 ans+=n/k;33 n/=k;34 }35 return ans;36 }37 int split(int n,int m)38 {39 int t;40 //printf("n=%d\n",n);41 if (n==0) return 0;42 if (m==0)43 {44 if (n==1) return 1;45 return 0;46 }47 for (int i=0;i<cnt && (__int64 )pri[i]*pri[i]<=(__int64 )n;i++)48 {49 if (n%pri[i]==0)50 {51 //printf("pri=%d\n",pri[i]);52 t=0;53 while (n%pri[i]==0)54 {55 t++;56 n/=pri[i];57 }58 int temp=getNumber(m,pri[i]);59 //printf("temp=%d t=%d\n",temp,t);60 if (temp<t) return 0;61 }62 }63 if (n!=1)64 {65 int temp=getNumber(m,n);66 if (temp<1) return 0;67 }68 return 1;69 }70 int main()71 {72 prime();73 int n,m;74 while (scanf("%d%d",&n,&m)!=EOF)75 {76 int ans=split(m,n);77 if (ans==1)78 {79 printf("%d divides %d!\n",m,n);80 }81 else82 {83 printf("%d does not divide %d!\n",m,n);84 }85 }86 return 0;87 }
poj2649 数论
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。