首页 > 代码库 > BZOJ3751: [NOIP2014]解方程

BZOJ3751: [NOIP2014]解方程

既然bzoj上有这道题了就把这个坑填了吧。。。

题解见:http://blog.csdn.net/popoqqq/article/details/40984859

话说这个解法如果当时想到冲突的概率很小的话应该就能想出来233

代码:

  1 #include<cstdio>  2   3 #include<cstdlib>  4   5 #include<cmath>  6   7 #include<cstring>  8   9 #include<algorithm> 10  11 #include<iostream> 12  13 #include<vector> 14  15 #include<map> 16  17 #include<set> 18  19 #include<queue> 20  21 #include<string> 22  23 #define inf 1000000000 24  25 #define maxn 100000 26  27 #define maxm 500+100 28  29 #define eps 1e-10 30  31 #define ll long long 32  33 #define pa pair<int,int> 34  35 #define for0(i,n) for(int i=0;i<=(n);i++) 36  37 #define for1(i,n) for(int i=1;i<=(n);i++) 38  39 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 40  41 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 42  43 #define mod 1000000007 44  45 using namespace std; 46  47 inline int read() 48  49 { 50  51     int x=0,f=1;char ch=getchar(); 52  53     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();} 54  55     while(ch>=0&&ch<=9){x=10*x+ch-0;ch=getchar();} 56  57     return x*f; 58  59 } 60 int n,m,tot,ans[1005],a[1005][10],f[1000000][10]; 61 const int p[5]={10007,11261,14843,19997,21893}; 62 char s[10000+5]; 63  64 int main() 65  66 { 67  68     freopen("input.txt","r",stdin); 69  70     freopen("output.txt","w",stdout); 71  72     n=read();m=read(); 73     for0(i,n) 74     { 75         scanf("%s",s+1);int len=strlen(s+1);bool flag=0; 76         for1(j,len) 77         { 78             if(s[j]==-)flag=1; 79             else for0(k,4)a[i][k]=(a[i][k]*10+s[j]-0)%p[k]; 80         } 81         if(flag)for0(k,4)a[i][k]=p[k]-a[i][k]; 82     } 83     //for0(i,n)for0(j,4)cout<<i<<‘ ‘<<j<<‘ ‘<<a[i][j]<<endl; 84     for0(j,4) 85      for0(i,p[j]-1) 86       { 87         f[i][j]=0; 88         for3(k,n,0)f[i][j]=(f[i][j]*i+a[k][j])%p[j]; 89       } 90     for1(i,m) 91     { 92         int j; 93         for(j=0;j<5;j++) 94          if(f[i%p[j]][j])break; 95         if(j==5)ans[++tot]=i; 96     } 97     printf("%d\n",tot); 98     for1(i,tot)printf("%d\n",ans[i]); 99 100     return 0;101 102 } 
View Code

还有加强版的,觉得没什么意思了。。。

 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #define M 110 6 using namespace std; 7 typedef long long ll; 8 const int prime[]={30011,11261,14843,19997,10007,21893}; 9 int n,m,stack[1001001],top;10 int ans[110],tot;11 ll a[M][6],f[30011][6];12 inline ll F(int x,int j)13 {14     int i;15     ll re=0;16     for(i=n;~i;i--)17         re=(re*x+a[i][j])%prime[j];18     return re;19 }20 inline void Input(int x)21 {22     static char s[10100];23     int i,j;24     bool flag=false;25     scanf("%s",s+1);26     for(i=1;s[i];i++)27     {28         if(s[i]==-)29             flag=true;30         else31             for(j=0;j<6;j++)32                 a[x][j]=( (a[x][j]<<1) + (a[x][j]<<3) + s[i]-0 )%prime[j];33     }34     if(flag) 35         for(j=0;j<6;j++)36             a[x][j]=prime[j]-a[x][j];37 }38 int main()39 {40     41     //freopen("equation.in","r",stdin);42     43     int i,j;44     cin>>n>>m;45     for(i=0;i<=n;i++)46         Input(i);47      48     for(j=0;j<6;j++)49         for(i=0;i<prime[j];i++)50             f[i][j]=F(i,j);51          52     for(i=0;i<prime[0];i++)53     {54         if(f[i%prime[0]][0]==0)55             stack[++top]=i;56     }57     58     for(i=1;i<=top;i++)59     {60         if(stack[i]+prime[0]>m)61             break;62         stack[++top]=stack[i]+prime[0];63     }64     65     for(i=1;i<=top;i++)66     {67         if(stack[i]>m)68             break;69         for(j=1;j<6;j++)70             if(f[stack[i]%prime[j]][j])71                 break;72         if(j==6)73             ans[++tot]=stack[i];74     }75     76     cout<<tot<<endl;77     for(i=1;i<=tot;i++)78         printf("%d\n",ans[i]);79 }
View Code

 

BZOJ3751: [NOIP2014]解方程