1. 程式人生 > >BZOJ3751 NOIP2014 解方程(Hash)

BZOJ3751 NOIP2014 解方程(Hash)

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)