UVA 1069

题目链接 :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 long
using 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值