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 }

 

posted @ 2013-01-29 22:05  ACSeed  Views(147)  Comments(0)    收藏  举报