码迷,mamicode.com
首页 > 其他好文 > 详细

【原根】【动态规划】【bitset】2017四川省赛 K.2017 Revenge

时间:2017-09-08 21:49:27      阅读:621      评论:0      收藏:0      [点我收藏+]

标签:方案   amp   logs   cst   题意   ret   转化   bit   namespace   

题意:

给你n(不超过200w)个数,和一个数r,问你有多少种方案,使得你取出某个子集,能够让它们的乘积 mod 2017等于r。

2017有5这个原根,可以使用离散对数(指标)的思想把乘法转化成加法,然后就可以用bitset优化dp了。

裸的dp方程是f(i,j)=f(i-1,j)+f(i-1,(j-I(a(i)))%2016),第一维可以滚动。I(i)规定为i的指标,但是我们这里不像《数论概论》那本书上把I(1)规定为2016,而当成0,比较方便。

#include<cstdio>
#include<bitset>
#include<iostream>
using namespace std;
bitset<2016>f;
int n,a[2000005],r,I[2020];
int main(){
	//freopen("yuangen.in","r",stdin);
	int pw=1;
	for(int i=1;i<2017;++i){
		pw=(pw*5)%2017;
		I[pw]=i;
	}
	I[1]=0;
	while(scanf("%d%d",&n,&r)!=EOF){
		f.reset();
		f.set(I[1]);
		for(int i=1;i<=n;++i){
			scanf("%d",&a[i]);
		}
		for(int i=1;i<=n;++i){
			f^=((f<<I[a[i]])^(f>>(2016-I[a[i]])));
		}
		cout<<f[I[r]]<<endl;
	}
	return 0;
}

【原根】【动态规划】【bitset】2017四川省赛 K.2017 Revenge

标签:方案   amp   logs   cst   题意   ret   转化   bit   namespace   

原文地址:http://www.cnblogs.com/autsky-jadek/p/7496328.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!