équations de résolution NOIP2014 résolution rapport

Voir le titre original Luo Valley ( https://www.luogu.org/problem/show?pid=2312 )
QWQ
semble avoir une chose appelée la méthode de Horner - cette chose est un moyen de calculer la valeur du polynôme peut être utilisé pour réduire le nombre des opérations réalisées pour expliquer la méthode de Horner Baidu Encyclopédie de - mais ceci est essentiellement une teneur élevée en mathématiques à l'école est allé au lycée sût lien :( TAT https://baike.baidu.com/item/ ? méthode de Horner / 449196 = fr aladdin)
Cette question est peut - on faire à gauche comme un polynôme par la méthode de Horner compter sur la ligne ah ~

inline bool qjs(long long x){
    sum=0;
    for(register int i=n;i>=0;i--){
        sum=((a[i]+sum)*x)%p;
    }
    return !sum;
}

L'idée est la suivante par un de 1 ~ formule m valeur d'énumération, tant que la valeur de l'équation est 0 compter sur une bonne
première affiché le code pour l' expliquer dans une complainte woo ~ ~

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int p=1000000007;
long long a[110],key[1000000];
bool t=true;
int ans=0,cnt,sum=0;
int n,m;

inline long long read(){
    long long sum=0,fg=1;
    char c=getchar();
    while(c<'0' || c>'9'){
        if(c=='-'){
            fg=-1;
        }
        c=getchar();
    }
    while(c>='0' && c<='9'){
        sum=((sum*10)+c-'0')%p;
        c=getchar();
    }
    return sum*fg;
}
inline void out(int x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9){
        out(x/10);
    }
    putchar(x%10+'0');
}
inline bool qjs(long long x){
    sum=0;//一定要清零
    for(register int i=n;i>=0;i--){
        sum=((a[i]+sum)*x)%p;
    }
    return !sum;
}

int main(){
    n=read();
    m=read();
    for(register int i=0;i<=n;i++){
        a[i]=read();
    }
    for(register int i=1;i<=m;i++){
        if(qjs(i)){
            t=false;
            ans++;
            cnt++;
            key[cnt]=i;
        }
    }
    if(t){
        out(ans);
        printf("\n");
        return 0;   
    }
    out(ans);
    printf("\n");
    for(register int i=1;i<=cnt;i++){
        out(key[i]);
        printf("\n");
    }
    return 0;
}

p est un grand nombre premier, pour éviter l'int explosion, et peut se rappeler la lecture d' optimisation, nous examinons aussi le film,
alors quelle est la fonction lecture et lecture et amis rapide de sortie rapide ~
BOOL t t est utilisé pour déterminer si oui ou non solvable. Solutions Cnt au nombre d'enregistrements. pour enregistrer les résultats du polynôme somme, il faut rappeler que la somme doit être effacée fonction QJs, sinon est de 10 points, le tableau A est enregistré, les coefficients de polynôme de tableau de valeurs clés est utilisée pour enregistrer la valeur de chacune des solutions d'
une copie solution annotée:

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const int p=1000000007;//取模比较方便为
bool t=true;//用来判断是否有解 
int n,m,ans,cnt,sum=0;//cnt记录解的个数;sum用来计算多项式的结果 
int A[103],key[1000003];
//A[]记录式中的a0,a1,a2(注意是以0为起点)
//key记录每个解的值 
ll read(){//读入优化(似乎不加会T两个点w)
    ll sum=0,fg=1;
    char c=getchar();
    while(c < '0' || c > '9'){
        if(c=='-') fg=-1;//如果读到负号则记录 
        c=getchar();
    }
    while(c >='0' && c <='9'){
        sum=((sum*10)+c-'0')%p;
        //注意因为A[]可能很大,所以读入时就要进行取模操作 
        c=getchar();
    }
    return sum*fg;
    //如果是负数(fg==-1,即读到了负号)那么返回的值为负数 
}
void print(int x){//输出优化(这个可以不加)
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9){
        print(x/10);
    }
    putchar(x%10+'0');
}
bool calc(ll x){
    sum=0;//一定要清零!!!
    for(ll i=n;i>=0;i--){
        sum=((A[i]+sum)*x)%p;
        //这里套用秦九韶算法求多项式的值 
    }
    return !sum;//如果答案是0说明x值为该多项式的解,返回1(true) 
}
int main(){
    n=read();
    m=read();
    for(ll i=0;i<=n;i++){
        A[i]=read();
    }
    for(ll i=1;i<=m;i++){
        if(calc(i)){//如果返回的是1(true)则说明有解 

            t=false; 
            ans++;//记录答案个数 
            key[++cnt]=i;//记录每个解的值 
        }
    }
    if(t){
        cout<<ans<<endl;//如果t未改变则说明解的个数为0 
        return 0;
    }
    print(ans);
    printf("\n");
    for(ll i=1;i<=cnt;i++){
        print(key[i]);
        printf("\n");
    }
    return 0;
}

Et puis la complexité temporelle de l'algorithme est d'environ O (n * m), cette sortie de cette question à A

Publié 41 articles originaux · louange gagné 58 · vues + 60000

Je suppose que tu aimes

Origine blog.csdn.net/a1351937368/article/details/78087687
conseillé
Classement