AcWing - 515 - 解方程 = 简单数学

Posted inko

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing - 515 - 解方程 = 简单数学相关的知识,希望对你有一定的参考价值。

https://www.acwing.com/problem/content/517/

给一个多项式,求他的整数根。

首先稳妥的办法应该是整一大堆质数,然后用中国剩余定理合并(当然不是真的合并)。

奇怪一点的就用几个就可以了,卡掉的概率极低,加上是OI其实没问题的。

但是这题卡常,要用秦九韶公式卡掉一半的乘法(和取模),还卡读入,真的垃圾题。

注意读入的时候要%p而不是-p,找到一个写法的bug不错。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MAXP = 1;
const int p = 19260817;

int ap[105];

inline int read() {
    int b = 0;
    char c = getchar();
    while(true) {
        if(c == '-' || (c >= '0') && (c <= '9'))
            break;
        c = getchar();
    }
    if(c == '-') {
        b = 1;
        c = getchar();
    }
    int cur = 0;
    while(c >= '0' && c <= '9') {
        cur = (cur << 3) + (cur << 1) + (c - '0');
        if(cur >= p)
            cur %= p;
        c = getchar();
    }
    if(b)
        cur = (p - cur) % p;
    return cur;
}

inline void write(int x) {
    if(x <= 9) {
        putchar('0' + x);
    } else {
        write(x / 10);
        putchar('0' + x % 10);
    }
}

int ans[1000005];
int atop = 0;

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    int n = read(), m = read();
    for(int i = 0; i <= n; ++i)
        ap[i] = read();

    for(int x = 1; x <= m; ++x) {
        ll cur = 0;
        for(int i = n; i >= 1; --i) {
            cur = (cur + ap[i]) * x;
            if(cur >= p)
                cur %= p;
        }
        cur = (cur + ap[0]) % p;
        if(cur == 0)
            ans[++atop] = x;
    }

    write(atop);
    putchar('
');
    for(int i = 1; i <= atop; ++i) {
        write(ans[i]);
        putchar('
');
    }
    return 0;
}

以上是关于AcWing - 515 - 解方程 = 简单数学的主要内容,如果未能解决你的问题,请参考以下文章

组合数学经典方程的对偶方程一个不等式问题(例题:acwing1312 序列统计)

FZU 2125 简单的等式 数学/枚举解方程式

数学神器!Sympy 模块解数学方程解微积分

数学 它的内容,方法和意义 第二卷

数学实验MATLAB 求解齐次线性方程组

数学解方程