1. 程式人生 > >uva 10375 質數篩選 質數分解 lrj-P316

uva 10375 質數篩選 質數分解 lrj-P316

題意:

求解C(p,q)/ C(r,s),保留五位小數

題解:

劉汝佳老師的程式碼真的很好,思路很清晰,好好品味,好好學習

#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

#define MAXN 10010
#define LL long long
const LL mod=1000000007LL;
LL flag[MAXN];
int primer[MAXN],cnt;
void get_primer()
{
    flag[0]=flag[1]=1;
    int sqrtmaxn=(int)sqrt((double)MAXN);
    for(int i=2;i<MAXN;i++){
        if(primer[i]==0){
            flag[i]=flag[i-1];

            primer[cnt++]=i;
            if(i<=sqrtmaxn)
                for(int j=i*i;j<MAXN;j+=i)
                primer[j]=1;
        }
        else flag[i]=(flag[i-1]*i)%mod;
    }
}

int e[MAXN];
void add_integer(int n,int d){
    for(int i=0;i<cnt;i++){
        while(n%primer[i]==0){
            n/=primer[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()
{
    int p,q,r,s;
    get_primer();
    //freopen("in.txt","r",stdin);
    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.0;
        for(int i=0;i<cnt;i++)
            ans*=pow(primer[i],e[i]);
        printf("%0.5lf\n",ans);
    }
    return 0;
}


相關推薦

uva 10375 質數篩選 質數分解 lrj-P316

題意: 求解C(p,q)/ C(r,s),保留五位小數 題解: 劉汝佳老師的程式碼真的很好,思路很清晰,好好品味,好好學習 #include<math.h> #include<s

UVa 10375 - Choose and divide(唯一分解定理)

ide clas 數組 AI AS lin buffered ring buffere 鏈接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_p

UVa 10375 Choose and divide (唯一分解定理)

divide include n! reg pan gist inline har class 題目 題目大意 已知\(C(m, n) = m! / (n!(m - n)!)\), 輸入整數\(p\), \(q\), \(r\), \(s\)(\(p ≥ q\), \(r

UVA-10375 唯一分解定理

#include<iostream> #include<string.h> #include<algorithm> #include<math.h> #include<stdio.h> #define rep(i,j,k) for(int i=

Eular質數篩選方法

1.有時候我們給出長度為N的區間需要求解出這個區間中質數的個數,假如使用素數定理來求解出的話時間複雜度可能有點高,因為使用素數定理的時候核心程式碼如下:  for(int i = 2;i < x; i++){      &

UVA - 10375(唯一分解定理)

#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> using nam

204. Count Primes的C++解法(篩選質數)

題目描述:https://leetcode.com/problems/count-primes/ 埃拉託斯特尼篩法 class Solution { public: int countPrimes(int n) { vector<bool> num(n

質數篩選方法(埃拉託斯特尼篩法)

今天刷題刷了這麼一道題, The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million. 大概意思是10以內的質數加法和為 2

BZOJ 2818 Gcd(尤拉函式+質數篩選

2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 9108  Solved: 4066 [Submit][Status][Discuss] De

uva 10375 唯一分解定理 篩法求素數【數論】

唯一分解理論的基本內容: 任意一個大於1的正整數都能表示成若干個質數的乘積,且表示的方法是唯一的。換句話說,一個數能被唯一地分解成質因數的乘積。因此這個定理又叫做唯一分解定理。 舉個栗子:50=(2^1)*(5^2)  題目一般的思路就是要把素數表打出來,eg上面的例子 e

uva 10375 (唯一分解定理+篩素數)

 Choose and divide DescriptionThe binomial coefficient C(m,n) is defined as                                    m!              C(m,n) =  

uva 10375 Choose and Divide

ans std ble 遍歷 bre color ios 素數 and 將要求的數離散為素數的指數,然後遍歷一遍素數表。。。。 #include <cstdio> #include <iostream> #include <cstring&g

UVA-10375 數學

pro mat logs sin .net pri code urn tdi UVA-10375 題意 : 輸入p,q,r,s,求C(p,q)/C(r,s). p,q,r,s<=10000;結果不超過1e8 代碼: //顯然不能直接計算,考慮每個數都可以

Choose and divide UVA - 10375

cstring div n) define all inpu small you sample Choose and divide UVA - 10375 The binomial coefficient C(m, n) is defined as C(m, n) = m

求n以內的質數質數的定義:在大於1的自然數中,除了1和它本身意外,無法被其他自然數整除的數)

思路: 1.(質數篩選定理)n不能夠被不大於根號n的任何質數整除,則n是一個質數2.除了2的偶數都不是質數程式碼如下: /** * 求n內的質數 * @param int $n * @return array */ function get_prime($n) { $prime =

51nod 1181 質數中的質數質數篩法)

原題 參考了網上的大概縷清了思路,用自己的方法做一直都是編譯錯誤,不是很懂,請求大佬指點。 解題思路:首先建立prime[]陣列,用於判斷陣列中的下標所對應的值是質數還是非質數。若為質數,則標記為0,否則標記為1。 從2開始依次判斷,若該數為質數,則計數變數加1,再判斷

UVa 10892 LCM Cardinality (質因數分解)

題目傳送門 題意:輸入一個數n,問若n==LCM(a,b),存在的這種(a,b)共有多少對。 題解:首先先了解一下LCM(a,b)的由來。 將a,b拆分 設max(kai,kbi)=ri; 所以如果a中取ri,則b只能取[0,ri-1],則有ri種; 如果

ACM-ICPC 2018 南京賽區網路預賽-J Sum(線性篩選+因數分解

A square-free integer is an integer which is indivisible by any square number except 11. For example, 6 = 2 \cdot 36=2⋅3 is square-free, b

java質數判斷/質數因子/所有質數(素數)*

1.質數(素數)數判斷: boolean isPrime(int number) { boolean isPrime = true; for (int i = 2; i

UVA 10375 Choose and divide(組合數學)

Problem D: Choose and divide The binomial coefficient C(m,n) is defined as m! C(m,n) = -------- n!(m-n)! Given four