UVA 1069

来源:互联网 发布:房产拍卖淘宝司法拍卖 编辑:程序博客网 时间:2024/04/30 13:10

题目链接 :http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=255&page=show_problem&problem=3510

题意: 求给你的多项式对于n的取值是否答案总是为整数 

做法是把1..k+1全部代入看结果是否都为整数,白书P124页有具体证明



#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<string>#define LL long longusing namespace std;LL d,c[105];char s[10005];LL pow_mod(LL x,LL y){    LL ret=1;    while(y){        if(y&1)        ret=ret*x%d;        y>>=1;        x=x*x%d;    }    return ret;}int main(){    LL ics=0,tmp,tmp2,k,f;    while(~scanf("%s",s)){        LL l=strlen(s);        if(s[0]=='.')        break;        memset(c,0,sizeof(c));        LL i=1;        k=0;        while(i<l){            f=1;            if(s[i]==')')            break;            if(s[i]=='-'||s[i]=='+'){                if(s[i]=='-')                f=-1;                i++;            }            tmp=0;            while(isdigit(s[i])){                tmp=tmp*10+s[i]-'0';                i++;            }            if(!tmp)            tmp=1;            if(s[i]!='n'){                c[0]=f*tmp;                break;            }else            i++;            tmp2=0;            if(s[i]=='^'){                i++;                while(isdigit(s[i]))                tmp2=tmp2*10+s[i]-'0',i++;            }else            tmp2=1;            c[tmp2]=f*tmp;            if(tmp2>k)            k=tmp2;        }        while(!isdigit(s[i]))        i++;        d=0;        while(isdigit(s[i])&&i<l)        d=d*10+s[i]-'0',i++;        LL res=0;        for(i=1;i<=k+1;i++){            res=0;            for(LL j=0;j<=k;j++){                res=(res+c[j]*pow_mod(i,j)+d)%d;            }            if(res){                break;            }        }        printf("Case %lld: ",++ics);        if(i!=k+2)        printf("Not always an integer\n");        else        printf("Always an integer\n");    }    return 0;}


0 0
原创粉丝点击