• 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
    ",tot);
     98     for1(i,tot)printf("%d
    ",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
    ",ans[i]);
    79 }
    View Code
  • 相关阅读:
    边缘计算的爆发为安防全产业带来了怎样的变化?
    Kali卸载AWVS的方法
    C++最简打开网页的方法
    C# 打开指定文件或网址
    C# 如何获取某用户的“我的文档”的目录
    基于Debian的linux系统软件安装命令
    C#的基础知识
    MYSQL语句中的增删改查
    将博客搬至CSDN
    【易懂】斜率DP
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4108775.html
Copyright © 2020-2023  润新知