/************************************************************************/ |讀 初等數論及其應用時想到的一種題目,不過目前還從未做過類似的題 |就是求出大數階乘的素因子分解(算術基本定理). 思路:先涮素數,大數n範圍內的素數全部找到 |然後找出1-n之間的最大素因子記爲max_prime, 然後逐步枚舉1-n每個數的質因子即可 /************************************************************************/ #include<iostream> #include<cmath> #include<fstream> using namespace std; const int maxn = 10001; bool isprime[maxn]; int prime[maxn/3]; int power[maxn]; //涮素數1-n int getprime(int n) { int i, j, k = 0; int s, e = (int)sqrt(n*1.0) + 1; memset(isprime, true, sizeof(isprime)); isprime[0] = isprime[1] = false; prime[k++] = 2; for(i=4; i<n; i+=2) isprime[i] = false; for(i=3; i<n; i+=2) { if(isprime[i]) { prime[k++] = i; for(s=i*2, j=i*i; j<n; j+=s) { isprime[j] = false; } } } for(; i<n; i+=2) { if(isprime[i]) prime[k++] = i; } return k; } //找到數x的質因子分解 void spilt(int x, int k) { for(int i=0; i<k; i++) { while(x%prime[i]==0) { power[prime[i]]++; x /= prime[i]; } if(x==1) break; } } //分解n! int solve(int n, int k) { memset(power, 0, sizeof(power)); int maxprime = 0; for(int i=2; i<=n; i++) { if(isprime[i]) { power[i]++; if(maxprime < i) maxprime = i; } else spilt(i, k); } return maxprime; } //輸出n!的質因子冪的格式 void output(int maxprime) { //freopen("out.txt", "w", stdout); for(int i=2; i<=maxprime; i++) { if(power[i]!=0) { if(i!=maxprime) printf("%d^%d*", i, power[i]); else printf("%d^%d/n", i, power[i]); } } } int main() { int n, k; k = getprime(maxn); while(scanf("%d", &n)!=EOF) { if(n==0) break; int max_prime = solve(n, k); output(max_prime); } return 0; } /* int main() { freopen("out.txt", "w", stdout); int k = getprime(maxn); for(int j=2; j<=1000; j++) { int max_prime = solve(j, k); for(int i=2; i<=max_prime; i++) { if(power[i]!=0) { if(i!=max_prime) printf("%d^%d*", i, power[i]); else printf("%d^%d/n", i, power[i]); } } printf("/n"); } return 0; } */
/************************************************************************/ | 求 a^n % b (a,b,n <= 1000000000) k is Z