uva 10375

时间:2023-03-09 03:52:24
uva 10375
  /*  选择与除法_________________________________________________________________________________

                           #include <iostream>
#include <map>
#include <cmath>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
#define fir first
#define sec second
#define pb(x) push_back(x)
#define mem(A, X) memset(A, X, sizeof A)
#define REP(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
#define rep(i,l,u) for(int (i)=(int)(l);(i)>=(int)(u);--(i))
#define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e)
typedef long long LL;
typedef unsigned long long ull;
typedef pair<long,long> pll; LL T,n;
const int mod=1e9+7;
const int maxn=10000;
int num[maxn+1];
const int SIZE=1e5+300;//1e6;
bool isprime[SIZE];// filter[i]=true 表示i是素数. 筛选的范围是 0,1,2,... SIZE-1. 共SIZE个. 如果想筛0到7的素数,就把SIZE定为7+1;(因为总是多了个0)
void primefilte()
{ for(int i=0;i<=1;i++) isprime[i]=false;
for (int i=2; i<=SIZE; i++)
{
if(i & 1 || i==2) isprime[i] = true;
else isprime[i] = false;
} for (int i=3; i<=(int)sqrt((long double)SIZE); i++)
{
if (isprime[i])
{
int j = i*2;
while (j<=SIZE)
{
if (isprime[j])
isprime[j] = false;
j+=i;
}
}
}
//for (int i=2; i<=SIZE-1; i++)
// if (isprime[i]) printf("%d ",i);
} vector<int> base;
void addint(int n,int p)
{
REP(i,0,base.size()-1)
{
while(n%base[i]==0)
{
num[i]+=p;
n/=base[i];
}
}
}
void addf(int n,int p)
{
//rep(i,n,2)
//num[i]+=p;
REP(i,2,n)
addint(i,p);
}
int main()
{
freopen("in.txt","r",stdin);
//while(cin>>n) primefilte();
REP(i,2,10000)
if(isprime[i]) base.pb(i); int p,q,r,s;
while(cin>>p>>q>>r>>s)
{
//REP(kase,1,T) { }
mem(num,0);
addf(p,1);
addf(s,1);
addf(r-s,1);
addf(p-q,-1);
addf(q,-1);
addf(r,-1);
double ans=1;
REP(i,0,base.size()-1)
ans*=pow(base[i],num[i]);
printf("%.5lf\n",ans);
}
return 0;
} /*
note : 有一个地方:刚开始直接用的1 2 3 ... 10000作的基(写起来简单),出错了,
因为这样表示太浪费,损失了精度(几乎每次计算都是很小的数计算,误差增大),
于是希望稠密表示,减少误差,唯一分解定理(单次计算数字增大),使得误差降低.
debug : 代码除了模板其他的代码不要复制,不然易出错.应该重新写
optimize:
*/