题意: 求给你的多项式对于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;
}