UVA——10139(数论)(挑战编程题目)

来源:互联网 发布:软件销售分成比例 编辑:程序博客网 时间:2024/04/29 15:42

题目地址:

http://uva.onlinejudge.org/index.phpoption=com_onlinejudge&Itemid=8&page=show_problem&category=13&problem=1080&mosmsg=Submission+received+with+ID+12122020

或者:http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110704&format=html

#include <iostream>#include <cmath>#include <cstring>#include <algorithm>#include <cstdio>#define INF 0xfffffffusing namespace std;int MOD;  int prime[20000];int flag[100010];long long q;void init(){memset(flag,0,sizeof(flag));  //筛选求素数,只求1—sqrt(2^31)内的就可以。long long i,j; q=0;for(i=2;i<100005;i++) { if(flag[i])  continue; prime[q++]=i; for(j=i*i;j<100005;j+=i)  //在这j=i*i可能会越界奥,最好还是用long long   flag[j]=1; }}int main(){int i,j,k,t;long long m,n,gg;init();int num,count,mid;while(cin>>n>>m) { gg=m; if(m==0||(n==0&&m>1)) { cout<<m<<" does not divide "<<n<<"!"<<endl;//特殊情况特判 continue; } if(m<=n)  { cout<<gg<<" divides "<<n<<"!"<<endl; continue; }   int sign=0;  for(i=0;prime[i]<=m&&m>1&&i<q;i++)   {   count=0;       if(m%prime[i]==0)    {           mid=prime[i];      count++;      m/=mid;      while(m%mid==0)      {   count++;       m/=mid;   }                   num=0;                 while(mid<=n)  { num+=(n/mid),mid*=prime[i];  //求阶乘下的素因子个数,有公式的 if(num>=count) break; } if(num<count)  { sign=1; break; }      }   }   if(sign)       {   cout<<gg<<" does not divide "<<n<<"!"<<endl;    continue;   }   if(m>1)    //若m大于1,则这个数一定是素数,即原来的m含有这个素因子。   {   if(m<=n) cout<<gg<<" divides "<<n<<"!"<<endl;      else cout<<gg<<" does not divide "<<n<<"!"<<endl;         }      else if(!sign) cout<<gg<<" divides "<<n<<"!"<<endl;    }return 0;} 




原创粉丝点击