演算法訓練 Torry的困惑(基本型)
阿新 • • 發佈:2019-01-02
問題描述
Torry從小喜愛數學。一天,老師告訴他,像2、3、5、7……這樣的數叫做質數。Torry突然想到一個問題,前10、100、1000、10000……個質數的乘積是多少呢?他把這個問題告訴老師。老師愣住了,一時回答不出來。於是Torry求助於會程式設計的你,請你算出前n個質數的乘積。不過,考慮到你才接觸程式設計不久,Torry只要你算出這個數模上50000的值。
輸入格式
僅包含一個正整數n,其中n<=100000。
輸出格式
輸出一行,即前n個質數的乘積模50000的值。
樣例輸入
1
樣例輸出
Torry從小喜愛數學。一天,老師告訴他,像2、3、5、7……這樣的數叫做質數。Torry突然想到一個問題,前10、100、1000、10000……個質數的乘積是多少呢?他把這個問題告訴老師。老師愣住了,一時回答不出來。於是Torry求助於會程式設計的你,請你算出前n個質數的乘積。不過,考慮到你才接觸程式設計不久,Torry只要你算出這個數模上50000的值。
輸入格式
僅包含一個正整數n,其中n<=100000。
輸出格式
輸出一行,即前n個質數的乘積模50000的值。
樣例輸入
1
樣例輸出
2
藍橋杯測試用例只有一個,就是8,都不超出long long型表示範圍,我也是醉了。
#include<stdio.h> #define MAX_N 100001 int prime[MAX_N];//第i個素數 bool is_prime[MAX_N + 1]; //返回n以內素數的個數 int sieve(int n) { int p = 0; for (int i = 0; i <= n; i++) is_prime[i] = true; is_prime[0] = is_prime[1] = false; for (int i = 2; i <= n; i++) { if (is_prime[i]){ prime[p++] = i; for (int j = 2*i; j <= n; j += i) is_prime[j] = false; } } return p;//個數 } int main(){ long long sum=1; int tot=sieve(20); for(int i=0;i<tot;i++){ sum=(sum*prime[i])%50000; } printf("%lld\n",sum); return 0; }
(a*b*c*d)%n==(((a*b)%n)*c)%n*d)%n
試過前8位素數之積相等,這個等式應該成立。