题目:Factovisors
思路:直接质因式分解除数,然后求得阶乘各质因子的幂是否大于除数的,注意特判情况(存在一个较大的素数,这个要判断n是不是大于等于那个很大的素数)
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define maxn 60000 bool vis[maxn]; int prime[maxn]; int cnt[maxn]; int n_prime=0; void Prime() { memset(vis,true,sizeof(vis)); vis[0]=vis[1]=0; for(int i=2;i<maxn;i++) { if(vis[i]) { prime[++n_prime]=i; for(int j=2*i;j<maxn;j+=i) vis[j]=0; } } //cout<<n_prime<<":"<<prime[n_prime]<<endl; } int get(int n,int factor) { int ans=0; int tmp=factor; while(tmp<=n) { ans+=n/tmp; tmp*=factor; } return ans; } bool is_ok(int n,int num) { memset(cnt,0,sizeof(cnt)); for(int i=1;i<=n_prime;i++) { while(num%prime[i]==0) { num/=prime[i]; cnt[i]++; } } cnt[0]=num; if(n<cnt[0]&&cnt[0]>1) return false; for(int i=1;i<=n_prime;i++) { if(cnt[i]) { if(get(n,prime[i])<cnt[i]) return false; } } return true; } int main() { int n,num; Prime(); while(scanf("%d%d",&n,&num)!=EOF) { if(is_ok(n,num)) printf("%d divides %d! ",num,n); else printf("%d does not divide %d! ",num,n); } return 0; }