zoukankan      html  css  js  c++  java
  • 【数论】【原根】【动态规划】【bitset】2017四川省赛 K.2017 Revenge

    题意:

    给你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;
    }
  • 相关阅读:
    HTTPS的七个误解(译文)
    WebLogic 11g重置用户密码
    IT项目管理工具
    Encrypt and Decrypt
    Tomcat Introduction
    浅谈https\ssl\数字证书
    What is POID
    数字签名和数字证书
    Apache Axis2 Practice
    Web Performance Tips
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7496328.html
Copyright © 2011-2022 走看看