Always an integer UVA - 1069(多项式的差分数列+模拟)

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

#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=b-1;i>=a;i--)
#define bug(x) printf("x:%d****\n",x)
typedef long long ll;


const int maxn=1010;
char str[maxn];
/*
(n^2-n)/2
(2n^3+3n^2+n)/6
(-n^14-11n+1)/3
.
*/

/*
平时最烦字符的题,发现只要找好了循环节,控制好边界,其实海星
*/
int cnt=0,len;
int get_xi(int& i){
    int sig=1;
    if(str[i]=='-')sig=-1,i++;
    if(str[i]=='+')sig=1,i++;

    if(str[i]=='n')return sig;
    int ans=0;
    while(i<len&&str[i]>='0'&&str[i]<='9')ans=ans*10+str[i++]-'0';
    return ans*sig;
}

int get_mi(int& i){
    if(str[i]!='n'){
       if(str[i]!=')')i++;
        return 0;
    }
    i++;
    if(str[i]!='^') {
        if(str[i]!=')')i++;
        return 1;
    }
    i++;
    int ans=0;
    while(i<len&&str[i]>='0'&&str[i]<='9')ans=ans*10+str[i++]-'0';
    return ans;
}

int get_d(int& i){
    int ans=0;
    while(i<len&&str[i]>='0'&&str[i]<='9')ans=ans*10+str[i++]-'0';
    return ans;
}

struct node{
    int n,m;
}p[110];

ll pow_mod(ll base,int n,int mod){
    ll ans=1;
    while(n){
        if(n&1)ans=ans*base%mod;
        base=base*base%mod;
        n>>=1;
    }
    return ans%mod;
}

ll solve(int x,int cnt,int d){
    ll ans=0;
    rep(i,0,cnt){
       ll tmp=pow_mod(x,p[i].m,d);
       ans=(ans+(ll)p[i].n*tmp%d)%d;
    }
    return ans;
}

int main(){
   int kase=1;
   while(scanf("%s",str)==1){
      if(str[0]=='.')break;
      int cnt=0;
      len=strlen(str);
      int pos=1;
      while(pos<len){
         p[cnt].n=get_xi(pos);
         p[cnt].m=get_mi(pos);
         cnt++;
         if(str[pos]==')')break;
      }
      pos+=2;
      int d=get_d(pos);
      int k=p[0].m+1;
      int wrong=0;
      rep(i,0,k+1){
         if(solve(i,cnt,d)){
            wrong=1;break;
         }
      }
      printf("Case %d: ",kase++);
      if(!wrong) printf("Always an integer\n");
      else printf("Not always an integer\n");

   }
    return 0;
}
#include<bits/stdc++.h>
using namespace std;

#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=b-1;i>=a;i--)
#define bug(x) printf("x:%d****\n",x)
typedef long long ll;


const int maxn=1010;
char str[maxn];
/*
(n^2-n)/2
(2n^3+3n^2+n)/6
(-n^14-11n+1)/3
.
*/

/*
平时最烦字符的题,发现只要找好了循环节,控制好边界,其实海星
*/
int cnt=0,len;
int get_xi(int& i){
    int sig=1;
    if(str[i]=='-')sig=-1,i++;
    if(str[i]=='+')sig=1,i++;

    if(str[i]=='n')return sig;
    int ans=0;
    while(i<len&&str[i]>='0'&&str[i]<='9')ans=ans*10+str[i++]-'0';
    return ans*sig;
}

int get_mi(int& i){
    if(str[i]!='n'){
       if(str[i]!=')')i++;
        return 0;
    }
    i++;
    if(str[i]!='^') {
        if(str[i]!=')')i++;
        return 1;
    }
    i++;
    int ans=0;
    while(i<len&&str[i]>='0'&&str[i]<='9')ans=ans*10+str[i++]-'0';
    return ans;
}

int get_d(int& i){
    int ans=0;
    while(i<len&&str[i]>='0'&&str[i]<='9')ans=ans*10+str[i++]-'0';
    return ans;
}

struct node{
    int n,m;
}p[110];

ll pow_mod(ll base,int n,int mod){
    ll ans=1;
    while(n){
        if(n&1)ans=ans*base%mod;
        base=base*base%mod;
        n>>=1;
    }
    return ans%mod;
}

ll solve(int x,int cnt,int d){
    ll ans=0;
    rep(i,0,cnt){
       ll tmp=pow_mod(x,p[i].m,d);
       ans=(ans+(ll)p[i].n*tmp%d)%d;
    }
    return ans;
}
/*
随机一下也是可以的
*/

int main(){
   int kase=1;
   while(scanf("%s",str)==1){
      if(str[0]=='.')break;
      int cnt=0;
      len=strlen(str);
      int pos=1;
      while(pos<len){
         p[cnt].n=get_xi(pos);
         p[cnt].m=get_mi(pos);
         cnt++;
         if(str[pos]==')')break;
      }
      pos+=2;
      int d=get_d(pos);
      int k=p[0].m+1;
      int wrong=0;
      rep(i,0,1000){
         int val=rand();
         if(solve(val,cnt,d)){
            wrong=1;break;
         }
      }
      printf("Case %d: ",kase++);
      if(!wrong) printf("Always an integer\n");
      else printf("Not always an integer\n");

   }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36424540/article/details/81675371