根据定义每个数肯定能化成这样的形式:
p1^a * p2 ^ b * p3 ^ c ……,这里 p1,p2,……pn都是素数
先快速打出素数表,之后统计没个素数出现个个数就可以了
14024226 | 10375 | Choose and divide | Accepted | C++ | 0.325 | 2014-08-12 00:57:06 |
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<cmath>
#include<string>
#include<sstream>
#include<ctime>
using namespace std;
#define _PI acos(-1.0)
#define INF (1 << 10)
#define esp 1e-6
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> pill;
/*===========================================
===========================================*/
#define MAXD 10000 + 1
vector<int>Prime;
int ans[MAXD];
void Get_Prime(){
int vis[MAXD] = {0};
for(int i = 2 ; i < MAXD ; i++)if(!vis[i]){
Prime.push_back(i);
for(int j = i * i ; j < MAXD ; j += i)
vis[j] = 1;
}
return ;
}
void _solve(int n,int d){
for(int i = 0 ; i < Prime.size() ; i++){
if(n % Prime[i] == 0){
ans[Prime[i]] += d;
n = n / Prime[i];
i --;
}
if(n == 1)
break;
}
return ;
}
void _add(int n , int d){
for(int i = 2 ; i <= n ; i++){
_solve(i,d);
}
return ;
}
int main(){
int p,q,r,s;
Get_Prime();
while(scanf("%d%d%d%d",&p,&q,&r,&s) != EOF){
memset(ans,0,sizeof(ans));
_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 < Prime.size() ; i++){
_ans = _ans * 1.0 * pow(1.0 * Prime[i],1.0 * ans[Prime[i]]);
}
printf("%.5f\n",_ans);
}
return 0;
}