YAPTCHA
Problem Description
The math department has been having problems lately. Due to immense amount of unsolicited automated programs which were crawling across their pages, they decided to put Yet-Another-Public-Turing-Test-to-Tell-Computers-and-Humans-Apart on their webpages. In short, to get access to their scientific papers, one have to prove yourself eligible and worthy, i.e. solve a mathematic riddle.
However, the test turned out difficult for some math PhD students and even for some professors. Therefore, the math department wants to write a helper program which solves this task (it is not irrational, as they are going to make money on selling the program).
The task that is presented to anyone visiting the start page of the math department is as follows: given a natural n, compute
where [x] denotes the largest integer not greater than x.
Input
The first line contains the number of queries t (t <= 10^6). Each query consist of one natural number n (1 <= n <= 10^6).
Output
For each n given in the input output the value of Sn.
Sample Input
13
1
2
3
4
5
6
7
8
9
10
100
1000
10000
Sample Output
0
1
1
2
2
2
2
3
3
4
28
207
1609
Source
Central European Programming Contest 2008
题目类型:Wilson定理
算法分析:令p = 3k+7,则和式的一般项可以化简成((p - 1)! + 1) / p - [(p - 1)! / p],若p是合数,则由于k >= 1,即p >= 10,可以保证 p | (p - 1)! 设(p - 1)! = kp,则一般项化简为k + 1 / p - k = 1 / p = 0。若p是素数,则p | ((p - 1)! + 1),此时设(p - 1)! + 1 = kp,则一般项化简为k - [(kp - 1) / p] = k - [k - 1 / p]。由于1 / p < 1,则[k - 1 / p] = k - 1,则原式为k - (k - 1) = 1。总结一下就是若p是合数,则Ak = 1,若p是素数,则Ak = 0。最后求解的是Sigma Ak, k = 1~n
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#include <set> #include <bitset> #include <list> #include <map> #include <stack> #include <queue> #include <deque> #include <string> #include <vector> #include <ios> #include <iostream> #include <fstream> #include <sstream> #include <iomanip> #include <algorithm> #include <utility> #include <complex> #include <numeric> #include <functional> #include <cmath> #include <ctime> #include <climits> #include <cstdarg> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <cassert> using namespace std; #define CFF freopen ("aaa.txt", "r", stdin) #define CPPFF ifstream cin ("aaa.txt") #define LL long long const int INF = 0x7FFFFFFF; const int MOD = 1e9 + 7; const double EPS = 1e-6; const double PI = 2 * acos (0.0); const int maxn = 3e6 + 66; LL val[maxn]; bool prime[maxn+66]; LL primelist[maxn+66], prime_len; void Get () { memset (prime, true, sizeof (prime)); prime_len= 0; for (LL i = 2; i <= maxn; i++) { if (prime[i]) primelist[prime_len++] = i; for (LL j = 0; j < prime_len; j++) { if(i * primelist[j] > maxn) break; prime[i*primelist[j]] = false; if (i % primelist[j] == 0) break; } } prime[1] = false; } void PP () { memset (val, 0, sizeof (val)); for (LL i = 1; i <= 1e6 + 16; i++) { if (prime[3*i+7]) val[i] = val[i-1] + 1; else val[i] = val[i-1]; } } int main() { // CPPFF; Get (); PP (); LL t; cin >> t; while (t--) { LL n; cin >> n; cout << val[n] << endl; } return 0; } |
- « 上一篇:hdu2955
- hdu3065:下一篇 »