uva 10375 Choose and Divide
将要求的数离散为素数的指数,然后遍历一遍素数表。。。。
#include <cstdio> #include <iostream> #include <cstring> #include <queue> #include <vector> #include <cmath> using namespace std; typedef long long ll; int prime[10001]; int is_prime[10001]; int ret; void init() { ret=0; memset(is_prime,0,sizeof(is_prime)); for(int i=2;i<=10000;i++) { if(!is_prime[i]) { prime[ret++]=i; for(int j=i*2;j<=10000;j+=i) is_prime[i]=1; } } } int e[10001]; void add2(int n,int d) { for(int i=0;i<ret;i++) { int temp=prime[i]; while(n%temp==0) { n/=temp; e[i]+=d; } if(n==1) break; } } void add(int x,int d) { for(int i=1;i<=x;i++) add2(i,d); } int main() { int p,q,r,s; init(); while(cin>>p>>q>>r>>s) { memset(e,0,sizeof(e)); add(p,1); add(q,-1); add(p-q,-1); add(r,-1); add(s,1); add(r-s,1); double ans=1; for(int i=0;i<ret;i++) { ans*=pow(prime[i],e[i]); } printf("%.5lf\n",ans); } return 0; }