模版整理:
晒素数
void init() { cas = 0; for (int i = 0 ; i < MAXD ; i++) is_prime[i] = true; is_prime[0] = is_prime[1] = false; for (int i = 2 ; i < MAXD ; i++) { if (is_prime[i]) { prime[cas++] = i; for (int j = i + i ; j < MAXD ; j += i) is_prime[j] = false; } } }
合数分解
int x = src[i]; int cnt = 0,tot = 0; for (int j = 0 ; j < cas && prime[j] * prime[j] <= x ; j++) { if (x % prime[j] == 0) { res[cnt++] = prime[j]; while (x % prime[j] == 0) { tot++; x /= prime[j]; } } } if (x > 1) { res[cnt++] = x; tot++; }
大素数筛。1-2^31内某个长度小于10W的区间的素数个数
#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 100000; LL prime[MAXN / 10]; bool is_prime[MAXN + 10]; bool flag[MAXN + 10000] ; int cas; void init() { for (int i = 0 ; i < MAXN ; i++) is_prime[i] = true; is_prime[0] = false; is_prime[1] = false; cas = 0; for (int i = 2 ; i < MAXN ; i++) { if (is_prime[i]) { prime[cas++] = i; for (int j = i + i ; j < MAXN ; j += i) is_prime[j] = false; } } } int main() { init(); int T,kase = 1; scanf("%d",&T); while (T--) { LL a,b; scanf("%lld%lld",&a,&b); if (b <= 80000) { int cnt = 0; for (int i = a ; i <= b ; i++) if (is_prime[i]) cnt++; printf("Case %d: %d\n",kase++,cnt); continue; } else { if (a <= 2) a = 2; int sz = b - a; for (int i = 0 ; i <= sz ; i++) flag[i] = true; for (int i = 0 ; i < cas && prime[i] * prime[i] <= b ; i++) { int k = a / prime[i]; if (k * prime[i] < a) k++; if (k <= 1) k++; while (k * prime[i] <= b) { flag[k * prime[i] - a] = false; k++; } } int cnt = 0; for (int i = 0 ; i <= sz ; i++) if (flag[i] == true) cnt++; printf("Case %d: %d\n",kase++,cnt); } } return 0; }
判断1-N中5的因子的个数,可以将代码5改编
int cnt = 0; while (mid) { cnt += mid / 5; mid /= 5; }
中国剩余定理
LL china(int n,int *a,int *m) { LL M = 1,d,y,x = 0; for (int i = 0 ; i < n ; i++) M *= m[i]; for (int i = 0 ; i < n ; i++) { LL w = M / m[i]; gcd(m[i],w,d,d,y); x = (x + y * w * a[i]) % M; } return (x + M) % M; }
POJ 1061 青蛙的约会
欧几里德解方程
(y+nt)-(x+mt) = k * L;
(n - m)t + K'L = x - y;
求最小正整数解
#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; LL gcd(LL a, LL b) {return a % b == 0 ? b : gcd(b, a % b);} LL ext_gcd(LL a,LL b,LL &x,LL &y) { if (a == 0 && b == 0) return -1; if (b == 0) { x = 1; y = 0; return a; } LL d = ext_gcd(b,a % b,y,x); y -= a / b * x; return d; } LL x,y,m,n,L; int main() { while (scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&L) != EOF) { LL a = n - m, b = L, c = x - y; LL d = gcd(a,b); if (c % d != 0) { puts( "Impossible" ); continue; } a /= d; b /= d; LL x,y; ext_gcd(a,b,x,y); //cout << a << " " << b << " " << x << " " << y << endl; x *= c / d; y *= c / d; //cout << y << endl; //cout << x << endl; LL tmp = L / d; x = (x % tmp + tmp) % tmp; cout << x << endl; } return 0; }