zoukankan      html  css  js  c++  java
  • P2312 解方程

    Description

     已知多项式方程:

    a0+a1*x+a2*x^2+...+an*x^n=0
    求这个方程在[1,m]内的整数解(n和m均为正整数)。
     

    Input

    第一行包含2个整数n、m,每两个整数之间用一个空格隔开。
    接下来的n+1行每行包含一个整数,依次为a0,a1,a2,...,an。

    Output

     第一行输出方程在[1,m]内的整数解的个数。

    接下来每行一个整数,按照从小到大的顺序依次输出方程在[1,m]内的一个整数解。
     

    Sample Input

    2 10
    2
    -3
    1

    Sample Output

    2
    1
    2

    HINT

     

     对于100%的数据,0<n≤100,|ai|≤1010000,an≠0,m≤1000000。

    Solution:

      洛谷题面复制炸格式,这是bzoj的题面。

      思路就是hash模拟,因为多项式$A=0$,则$Amod p=0$。

      所以我们直接选几个邻近素数做为模数,然后枚举每个模数的的余系作为答案,$O(n)$判断多项式$A$的hash值是否为$0$,若$i$属于模数$p$的余系,且能使模$p$意义下$A=0$,显然$cmod p=i$的$c$都是解。

      用多个模数就能减小预处理时模数整除系数的概率,防止出WA(#^.^#)的情况。

      最后只需$O(m)$扫一遍$i$是否满足对于所有的模数取模的值能使$A=0$就好了。

    代码:

    /*Code by 520 -- 9.1*/
    #include<bits/stdc++.h>
    #define il inline
    #define ll long long
    #define RE register
    #define For(i,a,b) for(RE int (i)=(a);(i)<=(b);++(i))
    #define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);--(i))
    using namespace std;
    const int N=1000005,mod[5]={22861,22871,22877,22901,22907};
    int n,m,a[5][105];
    char s[N];
    bool vis[5][30005];
    int ans[N];
    
    int main(){
        scanf("%d%d",&n,&m);
        For(i,0,n) {
            scanf("%s",s);
            RE int len=strlen(s);
            For(k,0,4)
            if(s[0]=='-') {
                For(j,1,len-1) a[k][i]=((a[k][i]<<3)+(a[k][i]<<1)+(s[j]^48))%mod[k];
                a[k][i]=mod[k]-a[k][i];
            }
            else For(j,0,len-1) a[k][i]=((a[k][i]<<3)+(a[k][i]<<1)+(s[j]^48))%mod[k];
        }
        For(k,0,4) For(i,1,mod[k]) {
            RE int ans=a[k][n];
            Bor(j,0,n-1) ans=(ans*i+a[k][j])%mod[k];
            if(!ans) vis[k][i]=1;
        }
        For(i,1,m) {
            bool cnt=1;
            For(k,0,4) cnt&=vis[k][i%mod[k]];
            if(cnt) ans[++ans[0]]=i;
        }
        For(i,0,ans[0]) printf("%d
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    linux整理
    C++ 11 多线程--线程管理
    VS2013 配置全局 VC++目录
    visual studio运行时库MT、MTd、MD、MDd的研究
    C++(vs)多线程调试 (转)
    VS工程和Qt工程转换
    Qt 读写XML文件
    win32开发中多字节(ANSI)和宽字符(UNICODE)字符串处理函数参考
    QMenu----QT鼠标右键弹出菜单
    C++ 单例模式析构函数的运用,析构函数的线程安全
  • 原文地址:https://www.cnblogs.com/five20/p/9571544.html
Copyright © 2011-2022 走看看