BZOJ3751 NOIP2014 解方程(Hash)

题目链接  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;
}

  

posted @ 2017-11-29 00:31  cxhscst2  阅读(159)  评论(0编辑  收藏  举报