Factovisors
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 4431 | Accepted: 1086 |
Description
The factorial function, n! is defined thus for n a non-negative integer:
We say that a divides b if there exists an integer k such that
0! = 1
n! = n * (n-1)! (n > 0)
We say that a divides b if there exists an integer k such that
k*a = b
Input
The input to your program consists of several lines, each containing two non-negative integers, n and m, both less than 2^31.
Output
For each input line, output a line stating whether or not m divides n!, in the format shown below.
Sample Input
6 9 6 27 20 10000 20 100000 1000 1009
Sample Output
9 divides 6! 27 does not divide 6! 10000 divides 20! 100000 does not divide 20! 1009 does not divide 1000!
Source
#include <iostream> #include <vector> #include <cstring> #include <cstdio> using namespace std; const int MAXN=50000; bool vis[MAXN+10]; int prime[MAXN+10]; int n,m,p; vector<pair<int,int> > exp; void init()//素数筛选 { memset(vis,0,sizeof(vis)); p=0; for(int i=2; i<=MAXN; ++i) { if(vis[i]==false) prime[p++]=i; for(int j=0; j<p&&i*prime[j]<=MAXN; ++j) vis[i*prime[j]]=true; } } bool check(int x,int y)//判断当前的素数,n是否有这么多个 { int tmp=n,sum=0; while(tmp) { sum+=tmp/x; tmp/=x; } return y<=sum; } bool judge() { for(int i=0; i<exp.size(); ++i) if(!check(exp[i].first,exp[i].second)) return false; return true; } int main() { init(); while(scanf("%d%d",&n,&m)==2) { if(m==0) { printf("%d does not divide %d! ",m,n); continue; } exp.clear(); int t=m; for(int i=0; i<p&&prime[i]<=m; ++i) if(m%prime[i]==0) { int cnt=0; while(m%prime[i]==0) { m/=prime[i]; ++cnt; } exp.push_back(make_pair(prime[i],cnt));//m的素数个数与m的素数因子对应 } if(m!=1) exp.push_back(make_pair(m,1)); if(judge()) printf("%d divides %d! ",t,n); else printf("%d does not divide %d! ",t,n); } return 0; }