YAPTCHA UVALive - 4382(换元+威尔逊定理)
题意就是叫你求上述那个公式在不同N下的结果。 思路:很显然的将上述式子换下元另p=3k+7则有 Σ【(p-1)!+1/p-[(p-1)!/p]】 接下来用到一个威尔逊定理,如果p为素数则
( p -1 )! ≡ -1 ( mod p ) 即 (p-1)!+1 为 p的整数倍 因此不难发现【*】里面要么为0,要么为1,为1的情况就是p为素数的情况,然后统计k=1-n中 有多少个3*k+1素数就好了
#include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <cmath> #define MOD 2018 #define LL long long #define ULL unsigned long long #define Pair pair<int, int> #define mem(a, b) memset(a, b, sizeof(a)) #define _ ios_base::sync_with_stdio(0),cin.tie(0) //freopen("1.txt", "r", stdin); using namespace std; const int maxn = 3e6+10, INF = 0x7fffffff; int vis[maxn], ans[maxn]; void init() { mem(vis, 0); for(int i=2; i<=sqrt(maxn+0.5); i++) if(!vis[i]) for(int j=i*i; j<maxn; j+=i) vis[j] = 1; } void f() { mem(ans, 0); for(int i=1; i<= 1e6; i++) { int temp = 3*i+7; ans[i] = ans[i-1] + (1 - vis[temp]); } } int main() { init(); f(); int T, n; cin>> T; while(T--) { cin>> n; cout<< ans[n] <<endl; } return 0; }
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。