BZOJ3751 NOIP2014 解方程(Hash)
阿新 • • 發佈:2017-11-29
using str names cpp .com tar online target -i
題目鏈接 BZOJ3751
這道題的關鍵就是選取取模的質數。
我選了4個大概幾萬的質數,這樣剛好不會T
然後統計答案的時候如果對於當前質數,產生了一個解。
那麽對於那些對這個質數取模結果為這個數的數也要統計進答案。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 2e4 + 10; const int M = 1e6 + 10; const int p[6] = {0, 26833, 15259, 19249, 26681}; int n, m; char ch[N]; int a[10][N], fg; int s[M], len, ans; int main(){ scanf("%d%d", &n, &m); rep(i, 0, n){ scanf("%s", ch + 1); len = strlen(ch + 1); fg = 1; if (ch[1] == ‘-‘) fg = -1, ch[1] = ‘0‘; rep(j, 1, 4){ rep(k, 1, len) a[j][i] = (a[j][i] * 10 + ch[k] - 48) % p[j]; a[j][i] = (a[j][i] * fg + p[j]) % p[j]; } } rep(i, 1, 4){ rep(j, 0, p[i] - 1){ int x = a[i][n]; dec(k, n - 1, 0) x = (x * j + a[i][k]) % p[i]; if (!x) for (int k = j; k <= m; k += p[i]) ++s[k]; } } ans = 0; rep(i, 1, m) if (s[i] == 4) ++ans; printf("%d\n", ans); rep(i, 1, m) if (s[i] == 4) printf("%d\n", i); return 0; }
BZOJ3751 NOIP2014 解方程(Hash)