zoukankan      html  css  js  c++  java
  • BZOJ 3751 [NOIP2014]解方程

    题解:运用筛法的思想,%p意义下,F(x)!=0则F(x+p)!=0

    多选几个质数把F(x)!=0的筛去就可以了

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    int n,m;
    int ans;
    int vis[1000009];
    
    int p[51]={0,30011,11261,14843,19997,21893};
    int a[200][51];
    
    void Minit(){
    	memset(a,0,sizeof(a));
    	memset(vis,0,sizeof(vis));
    	ans=0;
    }
    
    char s[100009];
    int main(){
    	scanf("%d%d",&n,&m);
    //	for(int i=1;i<=50;++i)p[i]=10000+i;
    	Minit();
    	for(int i=0;i<=n;++i){
    		scanf("%s",s);
    		int len=strlen(s);
    		for(int k=1;k<=5;++k){
    			if(s[0]!='-'){
    				a[i][k]=s[0]-'0';
    			}else{
    				a[i][k]=0;
    			}
    			for(int j=1;j<len;++j){
    				a[i][k]=(a[i][k]*10+(s[j]-'0'))%p[k];
    			}
    			if(s[0]=='-'){
    				a[i][k]=(-a[i][k]+p[k])%p[k];
    			}
    		}
    	}
    //	for(int i=0;i<=n;++i)cout<<a[i][1]<<' ';
    //	cout<<endl;
    	for(int k=1;k<=5;++k){
    		for(int j=1;j<=min(p[k],m);++j){
    			long long fx=0;
    			for(int i=n;i>=0;--i)fx=(fx*j+a[i][k]+p[k])%p[k];
    //			cout<<fx<<endl;
    			if(fx){
    				for(int d=0;j+p[k]*d<=m;++d)vis[j+p[k]*d]=1;
    			}
    		}
    	}
    	
    	for(int i=1;i<=m;++i)if(!vis[i])++ans;
    	printf("%d
    ",ans);
    	for(int i=1;i<=m;++i)if(!vis[i])printf("%d
    ",i);
    	return 0;
    }
    

      

    自己还是太辣鸡了
  • 相关阅读:
    个人博客
    个人博客
    个人博客
    个人博客
    个人博客
    团队作业—个人记录
    4.21
    4.20
    4.19
    4.18
  • 原文地址:https://www.cnblogs.com/zzyer/p/8454915.html
Copyright © 2011-2022 走看看