zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4108775.html
Copyright © 2011-2022 走看看