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         else
31             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

 

posted @ 2014-11-19 17:24  ZYF-ZYF  Views(941)  Comments(0Edit  收藏  举报