您的位置:首页 > 其它

Choose and divide UVA - 10375

2018-02-26 08:06 239 查看
题目链接:Choose and divide UVA - 10375

唯一分解定理。。。。。。

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include
4000
<stack>
#include<map>
#include<iomanip>
#define ll long long

using namespace std;

const int maxn = 1e4+7;

int p,q,r,s,e[maxn];
bool isp[maxn];
vector<int> primes;

void prim() {
int m = sqrt(maxn + 0.5);
memset(isp,0,sizeof(isp));
for(int i = 2; i <= m; i++) if(!isp[i])
for(int j = i*i; j <=  m; j+=i) isp[j] = true;
for(int i = 2; i <= maxn; i++)
if(!isp[i]) primes.push_back(i);
}

void add_integer(int n, int d) {
for(int i = 0; i < primes.size(); i++) {
while(n % primes[i] == 0) {
n /= primes[i];
e[i] += d;
}
if(n == 1) break;
}
}

void add_factorial(int n, int d) {
for(int i = 1; i <= n; i++) {
add_integer(i, d);
}
}

int main() {
prim();
while(scanf("%d%d%d%d",&p,&q,&r,&s) != EOF)  {
memset(e, 0, sizeof(e));
add_factorial(p, 1);
add_factorial(q, -1);
add_factorial(p - q, -1);
add_factorial(r, -1);
add_factorial(s, 1);
add_factorial(r - s, 1);
double ans = 1;
for(int i = 0; i < primes.size(); i++) {
ans *= pow(primes[i], e[i]);
}
printf("%.5lf\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: