【數論】Choose and Divide, UVa10375 【組合數學】【唯一分解定理】【精度】
阿新 • • 發佈:2019-01-10
唯一分解定理
#include<bits/stdc++.h> using namespace std; int p,q,r,s,prime[10005],cnt,e[10005];bool vis[10005]; void getprime(int n){ vis[0] = vis[1] = 1; for(int i=2;i<=n;i++){ if(!vis[i])prime[++cnt]=i; for(int j=1;j<=cnt&&prime[j]<=n/i;j++){ vis[i*prime[j]]=true; if(i%prime[j]==0)break; } } } void addint(int n,int d){ for(int i=1;i<=cnt;i++){ while(n%prime[i]==0){ e[i]+=d; n/=prime[i]; } } } void add(int n,int d){//@結果乘以(n!)d for(int i=1;i<=n;i++)addint(i,d); } int main(){ ios::sync_with_stdio(false);getprime(10000); while(cin>>p>>q>>r>>s){ memset(e,0,sizeof(e));add(p,1);add(s,1);add(r-s,1);add(q,-1);add(p-q,-1);add(r,-1); double ans = 1;for(int i=1;i<=cnt;i++)ans*=pow(prime[i],e[i]); cout<<setiosflags(ios::fixed)<<setprecision(5)<<ans<<endl; } return 0; }