标签:方案 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