zoukankan      html  css  js  c++  java
  • P2312[秦九韶+读入取模+哈希解方程]

    P2312[秦九韶+读入取模+哈希解方程]

    image-20210202210042923 image-20210202210109460

    首先讲秦九韶

    \[a_0+a_1x+a_2x^2+...+a_nx^n=0\quad\Rightarrow\quad x(x(x(xa_4+a_3)+a_2)+a_1)+a_0=0 \quad[这里以n=4为例] \]

    其次,读入取模要改快读板子,改的地方我注释出来了,因为取一次模不放心于是多次取模

    #include<bits/stdc++.h>
    using namespace std;
    /*秦九韶+模大素数来哈希*/
    const int maxn=1e6+100;
    typedef long long ll;
    ll a[4][maxn],n,m;
    const int mod1=76543;
    const int mod2=23456789;
    const int mod3=1e9+9;
    namespace IO {
    #define gc getchar()
    #define pc(x) putchar(x)
        template<typename T>inline void read(T &x1,T &x2,T&x3) {///
            x1=x2=x3=0;//
            int f=1;
            char ch=gc;
            while(ch>'9'||ch<'0') {
                if(ch=='-')f=-1;
                ch=gc;
            }
            while(ch>='0'&&ch<='9')
            {
                x1=(x1<<3)+(x1<<1)+ch-'0',x1%=mod1;//
                x2=(x2<<3)+(x2<<1)+ch-'0',x2%=mod2;//
                x3=(x3<<3)+(x3<<1)+ch-'0',x3%=mod3;//
                ch=gc;
            }
            x1*=f,x2*=f,x3*=f;//
            return;
        }
        template<typename T>inline void write(T x=0) {
            T wr[51];
            wr[0]=0;
            if(x<0)pc('-'),x=-x;
            if(!x)pc(48);
            while(x)wr[++wr[0]]=x%10,x/=10;
            while(wr[0])pc(48+wr[wr[0]--]);
            return;
        }
    }
    using IO::read;
    using IO::write;
    bool calc(ll x){
        ll ans1=a[1][n]%mod1,ans2=a[2][n]%mod2,ans3=a[3][n]%mod3;
        for(int i=n-1;i>=0;i--){
            ans1=(ans1*x+a[1][i])%mod1;
            ans2=(ans2*x+a[2][i])%mod2;
            ans3=(ans3*x+a[3][i])%mod3;
        }
        return ans1==0&&ans2==0&&ans3==0;
    }
    int ans[maxn],num=0;
    int main(){
       scanf("%lld%lld",&n,&m);
       for(int i=0;i<=n;i++)
           read(a[1][i],a[2][i],a[3][i]);
        for(int i=1;i<=m;i++){
            if(calc(i)) ans[++num]=i;
        }
        printf("%d\n",num);
        for(int i=1;i<=num;i++){
            printf("%d\n",ans[i]);
        }
    }
    
  • 相关阅读:
    close 不弹出对话框
    ASP.NET会话(Session)保存模式
    ASP.NET页面刷新后滚动条保留在刷新前的位置 MaintainScrollPositionOnPostback
    CSS实现垂直居中的5种方法
    ExpandStackTrace
    HttpTunnel
    PropertyAccess类 Linq.Expressions 实现
    DatagramResolver
    AsyncUdpClient 类
    C# LockFreeStack类
  • 原文地址:https://www.cnblogs.com/zx0710/p/14364236.html
Copyright © 2011-2022 走看看