zoukankan      html  css  js  c++  java
  • NOIP2014 解方程 秦九韶算法+多项式处理

    题目描述

    已知多项式方程:

    (a_0+a_1*x_1+a_2*x_2+⋯+a_n*x_n=0)

    求这个方程在 $[1,m] $内的整数解(nm 均为正整数)。


    解:这道题真的是好 ~~~

    首先观察式子 这不就是一个秦九韶算法吗

    顺便复习一下秦九韶算法

    就是对于高次方程由内到外递归求解 每次乘以x 时间复杂度O(n)

    bool qsj(ll v,ll *y)
    {
        ll v2=y[n];
        
        for(ll i=n-1;i>=1;i--)
        {
            v2=(v2*v%mod+y[i])%mod;
        }
        return ((v2==0)?true:false);
    }
    

    但是你会发现a很大存不下 这时候你就需要 取模

    若f(x)0 f(x)%p0; mod p 意义下

    但是 当$ f(x)==k*p$的时候 加一波秦九韶算法验证 此方法可能会冲突 所以你需要 %一个较大质数比如$1e9+7 $

    或者多试几个(p)

    然后加上一波快读

    时间复杂度$O(m*n) $老板把我卡了


    然后注意到

    对于(a_0+a_1*x+a_2*x_2...+a_n*x_n=0)

    (%x) 后 对于$ x$ 我们有 (a_0)%(x ==0)
    这时候满足方程

    所以(x)(a_0) 的约数 你可以这样暴力 但是也会超时


    这个时候你就需要再次注意到

    其实(m)过于大 我们考虑减小(m)

    怎么减小呢??

    其实很简单

    对于一个多项式 我们you

    (f(x))%(p==f(x)%(p))%(p==)(f(x+p)) %(p)

    所以 对于一个 不能 作为答案的(x) 那么(x+p x+2*p ...)%p意义下 都不能作为答案

    所以你可以类似用一种筛法

    然后为了避免冲突 你可以 设几个参数

    最后还有一波很重要的快读


    Code:

    #include<iostream>
    #include<stdio.h>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    #define ll long long
    #define maxnn 2000000
    #define mod 1000000007
    #define mod1  191089
    #define mod2 195997
    #define mod3 186019
    #define mod4 21410
    #define mod5 10211
    #define mod6 15193
    #define mod8 26297
    #define mod9 15331
    #define mod7 19087
    ll a[maxnn],b[maxnn],c[maxnn];
    ll f1[maxnn],f2[maxnn],f3[maxnn];
    ll n,m;
    ll is[maxnn];
    #include<queue>
    string s;
    
    #define ll long long
    
    void rd(ll &a,ll &b,ll  &c){
        char ch=getchar();
        int  f=0;
        for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=1;
        a=b=c=ch^48;
        for(ch=getchar();ch>='0'&&ch<='9';ch=getchar()){
            a=((a<<3)+(a<<1)+(ch^48))%mod1;
            b=((b<<3)+(b<<1)+(ch^48))%mod2;
            c=((c<<3)+(c<<1)+(ch^48))%mod3;
        }
        if(f){a=-a;b=-b;c=-c;}
    }
    int tot=0;
    deque<int > Q;
    
    bool qsj1(ll v,ll *y)
    {
        ll v2=y[n];
        
        for(ll i=n-1;i>=1;i--)
        {
            v2=(v2*v%mod1+y[i])%mod1;
        }
        return ((v2==0)?true:false);
    }
    bool qsj2(ll v,ll *y)
    {
        ll v2=y[n];
        
        for(ll i=n-1;i>=1;i--)
        {
            v2=(v2*v%mod2+y[i])%mod2;
        }
        return ((v2==0)?true:false);
    }
    bool qsj3(ll v,ll *y)
    {
        ll v2=y[n];
        
        for(ll i=n-1;i>=1;i--)
        {
            v2=(v2*v%mod3+y[i])%mod3;
        }
        return ((v2==0)?true:false);
    }
    void init()
    {
        for(ll i=1;i<=mod1;i++)
        {
            if((!f1[i])&&(qsj1(i,a)))
            {
                for(ll j=i;j<=m;j+=mod1)
                {
                    f1[j]=1;
                }
            }
        }
        for(ll i=1;i<=mod2;i++)
        {
            if((!f2[i])&&(qsj2(i,b)))
            {
                for(ll j=i;j<=m;j+=mod2)
                {
                    f2[j]=1;
                }
            }
        }
        for(ll i=1;i<=mod3;i++)
        {
            if((!f3[i])&&(qsj3(i,c)))
            {
                for(ll j=i;j<=m;j+=mod3)
                {
                    f3[j]=1;
                }
            }
        }
        
        //    for(ll i=1;i<=mod4;i++)
        //    {
        //        if((!is[i])&&(!qsj(i)))
        //        {
        //            for(ll j=i;j<=m;j+=mod4)
        //            {
        //                is[j]=1;
        //            }
        //        }
        //    }
        //
        //    for(ll i=1;i<=mod5;i++)
        //    {
        //        if((!is[i])&&(!qsj(i)))
        //        {
        //            for(ll j=i;j<=m;j+=mod5)
        //            {
        //                is[j]=1;
        //            }
        //        }
        //    }
        //
        //    for(ll i=1;i<=mod6;i++)
        //    {
        //        if((!is[i])&&(!qsj(i)))
        //        {
        //            for(ll j=i;j<=m;j+=mod6)
        //            {
        //                is[j]=1;
        //            }
        //        }
        //    }
        //
        //    for(ll i=1;i<=mod7;i++)
        //    {
        //        if((!is[i])&&(!qsj(i)))
        //        {
        //            for(ll j=i;j<=m;j+=mod7)
        //            {
        //                is[j]=1;
        //            }
        //        }
        //    }
        //
        //    for(ll i=1;i<=mod8;i++)
        //    {
        //        if((!is[i])&&(!qsj(i)))
        //        {
        //            for(ll j=i;j<=m;j+=mod8)
        //            {
        //                is[j]=1;
        //            }
        //        }
        //    }
        //
        //    for(ll i=1;i<=mod9;i++)
        //    {
        //        if((!is[i])&&(!qsj(i)))
        //        {
        //            for(ll j=i;j<=m;j+=mod9)
        //            {
        //                is[j]=1;
        //            }
        //        }
        //    }
    }
    int main()
    {
        cin>>n>>m;
        n++;
        for(int i=1;i<=n;i++)
        {
            rd(a[i],b[i],c[i]);
        }
        init();
        for(int i=1;i<=m;i++)
        {
            if((f1[i]&&f2[i]&&f3[i]))
            {
                {
                    tot++;
                    Q.push_back(i);
                }
            }
        }
        cout<<tot<<endl;
        while(Q.size())
        {
            printf("%d
    ",Q.front());
            Q.pop_front();
        }
    }
    
    
    刀剑映出了战士的心。而我的心,漆黑且残破
  • 相关阅读:
    C# IEnumerable 和 IEnumerator接口浅析
    SQLite笔记
    命令行工具osql.exe使用
    2016年年终工作总结
    c# Json 自定义类作为字典键时,序列化和反序列化的处理方法
    多线程随笔
    常见异步机制分析
    SQL 通过syscolumns.xtype动态查找指定数据类型字段所包含的数据
    SQL 删除索引错误
    SQL 实用函数
  • 原文地址:https://www.cnblogs.com/OIEREDSION/p/11509667.html
Copyright © 2011-2022 走看看