1434 - YAPTCHA
1)当3k + 7不是质数时, 那么他的因子都在(3k + 6)!里面, 所以
(3k + 6)! % (3k + 7) == 0;
所以
(3k + 6)! / (3K + 7) == ((3k + 6)! + 1) / (3k + 7),
即: Sn = 0;
2)当3k + 7是质数时, 由威尔逊定理知:
(3k + 6)! = -1 mod (3k+7);
所以(3k + 6)! + 1刚好是 (3k + 7)的倍数, 即:(3k + 6)! / (3k + 7) 比 ((3k + 6)! + 1) / (3k + 7) 少1;
故,题目实际是求3 * n + 7 内有多少个形如 3k + 7的质数;
PS: 威尔逊定理的链接: http://xueke.maboshi.net/sx/sxgj/sxsh/shsl/81443.html
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 6 const int maxn = 4000000 + 10; 7 int prime[maxn], plen; 8 bool vis[maxn]; 9 10 void mklist() { 11 memset(vis, false, sizeof(vis)); 12 plen = 0; 13 for(int i = 2; i * i < maxn; ++i) { 14 if(!vis[i]) { 15 for(int j = i; j * i < maxn; ++j) 16 vis[i * j] = true; 17 } 18 } 19 } 20 21 int f[maxn]; 22 void init() { 23 f[0] = 0;f[1] = 0; 24 f[2] = f[3] = f[4] = f[5] = f[6] = f[7] = 0; 25 for(int i = 8; i <= maxn; ++i) { 26 if((i - 7) % 3 == 0 && !vis[i]) { 27 f[i] = f[i - 1] + 1; 28 } else f[i] = f[i - 1]; 29 } 30 } 31 32 int main() { 33 int T; 34 cin >> T; 35 mklist(); 36 init(); 37 while(T--) { 38 int n; 39 cin >> n; 40 n = 3 * n + 7; 41 cout << f[n] << endl; 42 } 43 return 0; 44 }


浙公网安备 33010602011771号