您的位置:首页 > 其它

uva 10375 选择与除法

2015-03-03 22:07 337 查看
入门经典例题,就不多少了。

/***********************************************
 * Author: fisty
 * Created Time: 2015/2/18 13:44:03
 * File Name   : uva10375.cpp
 *********************************************** */
#include <iostream>
#include <cstring>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
#define Debug(x) cout << #x << " " << x <<endl
#define Memset(x, a) memset(x, a, sizeof(x))
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef pair<int, int> P;
#define FOR(i, a, b) for(int i = a;i < b; i++)
vector<int> prime;
#define MAX_N 10010
int e[MAX_N];

void is_prime(){
    int n = 10000;
    int vis[MAX_N];
    Memset(vis, 0);
    int m = sqrt(n+0.5);
    for(int i = 2;i <= m; i++){
        if(!vis[i])
            for(int j = i*i;j <= n; j += i){
                vis[j] = 1;
            }
    }
    for(int i = 2;i <= n; i++){
        if(!vis[i]){
            prime.push_back(i);
        }
    }
}
void add_intger(int n, int d){
    //d = 1 为乘 d 为-1 为除
    for(int i = 0;i < prime.size(); i++){
        while(n % prime[i] == 0){
            n /= prime[i];
            e[i] += d;
        }
        if(n == 1) break;
    }
}
void add_factirial(int n,int d){
    for(int i = 1;i <= n; i++){
        add_intger(i, d);
    }
}

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