1 /* 选择与除法_________________________________________________________________________________ 2 3 #include <iostream> 4 #include <map> 5 #include <cmath> 6 #include <vector> 7 #include <cstdio> 8 #include <string> 9 #include <cstring> 10 #include <algorithm> 11 using namespace std; 12 #define fir first 13 #define sec second 14 #define pb(x) push_back(x) 15 #define mem(A, X) memset(A, X, sizeof A) 16 #define REP(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i)) 17 #define rep(i,l,u) for(int (i)=(int)(l);(i)>=(int)(u);--(i)) 18 #define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e) 19 typedef long long LL; 20 typedef unsigned long long ull; 21 typedef pair<long,long> pll; 22 23 24 LL T,n; 25 const int mod=1e9+7; 26 const int maxn=10000; 27 int num[maxn+1]; 28 const int SIZE=1e5+300;//1e6; 29 bool isprime[SIZE];// filter[i]=true 表示i是素数. 筛选的范围是 0,1,2,... SIZE-1. 共SIZE个. 如果想筛0到7的素数,就把SIZE定为7+1;(因为总是多了个0) 30 void primefilte() 31 { 32 33 for(int i=0;i<=1;i++) isprime[i]=false; 34 for (int i=2; i<=SIZE; i++) 35 { 36 if(i & 1 || i==2) isprime[i] = true; 37 else isprime[i] = false; 38 } 39 40 for (int i=3; i<=(int)sqrt((long double)SIZE); i++) 41 { 42 if (isprime[i]) 43 { 44 int j = i*2; 45 while (j<=SIZE) 46 { 47 if (isprime[j]) 48 isprime[j] = false; 49 j+=i; 50 } 51 } 52 } 53 //for (int i=2; i<=SIZE-1; i++) 54 // if (isprime[i]) printf("%d ",i); 55 } 56 57 vector<int> base; 58 void addint(int n,int p) 59 { 60 REP(i,0,base.size()-1) 61 { 62 while(n%base[i]==0) 63 { 64 num[i]+=p; 65 n/=base[i]; 66 } 67 } 68 } 69 void addf(int n,int p) 70 { 71 //rep(i,n,2) 72 //num[i]+=p; 73 REP(i,2,n) 74 addint(i,p); 75 } 76 int main() 77 { 78 freopen("in.txt","r",stdin); 79 //while(cin>>n) 80 81 primefilte(); 82 REP(i,2,10000) 83 if(isprime[i]) base.pb(i); 84 85 int p,q,r,s; 86 while(cin>>p>>q>>r>>s) 87 { 88 //REP(kase,1,T) { } 89 mem(num,0); 90 addf(p,1); 91 addf(s,1); 92 addf(r-s,1); 93 addf(p-q,-1); 94 addf(q,-1); 95 addf(r,-1); 96 double ans=1; 97 REP(i,0,base.size()-1) 98 ans*=pow(base[i],num[i]); 99 printf("%.5lf\n",ans); 100 } 101 return 0; 102 } 103 104 /* 105 note : 有一个地方:刚开始直接用的1 2 3 ... 10000作的基(写起来简单),出错了, 106 因为这样表示太浪费,损失了精度(几乎每次计算都是很小的数计算,误差增大), 107 于是希望稠密表示,减少误差,唯一分解定理(单次计算数字增大),使得误差降低. 108 debug : 代码除了模板其他的代码不要复制,不然易出错.应该重新写 109 optimize: 110 */
时间: 2024-11-01 10:05:44