UVa10375 選擇與除法(唯一分解定理)
阿新 • • 發佈:2019-01-08
解析:其中primes是前1000個素數,e陣列存放每個素數對應的指數。
程式碼例項:
#include<iostream> #include<cstring> #include<cmath> #include<cstdio> using namespace std; int primes[1005]; int e[1005]; void add_integer(int n,int d){ for(int i = 0;i < 1000;i++) if(n == 1) break; else while(n%primes[i] == 0){ e[i] += d; n /= primes[i]; } } void add_factorial(int n,int d){ for(int i = 1;i <= n;i++) add_integer(i,d); } void solve(int p,int q,int r,int s){ memset(e,0,sizeof e); add_factorial(p,1); add_factorial(q,-1); add_factorial(s,1); add_factorial(r,-1); add_factorial(r-s,1); add_factorial(p-q,-1); double ans = 1; for(int i = 0;i < 1000;i++) ans *= pow(primes[i],e[i]); printf("%.5lf\n",ans); } int main() { int isPrime[10000]; memset(isPrime,0,sizeof isPrime); for(int i = 2;i <= 100;i++) if(!isPrime[i]) for(int j = i*i;j < 10000;j+=i) isPrime[j] = 1; int cnt = 0; for(int i = 2;cnt < 1000;i++) if(!isPrime[i]) primes[cnt++] = i; int p,q,r,s; while(cin >> p >> q >> r >> s){ solve(p,q,r,s); } return 0; }