题意:
判断一个关于n的多项式P(n)能否恒被一个正整数D整除。
输入样例:
(n^2-n)/2
(2n^3+3n^2+n)/6
(-n^14-11n+1)/3
输出格式:
如果满足条件就输出“Always an integer”否则输出“Not always an integer”。
分析:
多项式为P(n)。设k为多项式中最高项的次数。我们只需要验证P(1)、P(2)、…、P(k+1)是否都被D整除即可。如果是,满足条件,否则不满足。
这是因为:
k=0时,只需要计算P(1)是否被D整除。
k=1时,P(n)=an+b,注意到P(n+1)-P(n)=a。P(n)是等差数列,于是只需要验证首项与公差是否被D整除,即验证P(1)、P(2)是否被D整除。
k=2时,P(n)=an^2+bn+c它的一阶差分数列是等差数列,如果原数列每一项被D整除,那么dP(n)每一项也被D整除,并且P(1)也被D整除,所以需要验证P(1)、P(2)、P(3)是否被D整除。
由数学归纳法可得,设k为多项式中最高项的次数,只需要验证P(1)、P(2)、…、P(k+1)是否都被D整除即可。

1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 typedef long long LL; 9 const int N = 500000; 10 char str[N + 1]; 11 int n,d; 12 LL a[N + 1],b[N + 1]; //ai:第i项的指数; bi:第i项的系数 13 LL Calc(LL x){ // 计算P(x)%d 14 LL Ans = 0; 15 for(int i = 1 ; i <= n ; i++){ 16 LL tmp = 1; 17 for(int j = 1 ; j <= a[i] ; j++) tmp = tmp * x % d; 18 Ans = (Ans + tmp * b[i] % d) % d; 19 } 20 return Ans; 21 } 22 int main(){ 23 int Case = 0; 24 while(scanf("%s",str) != EOF){ 25 if(str[0] == '.') break; 26 Case++; printf("Case %d: ",Case); 27 n = 0; 28 int L = strlen(str),i,f; 29 for(i = 1 ; i < L ; i++){ 30 if(str[i] == ')') break; // 之后的部分是数d 31 n++; 32 if(str[i] == '-' || str[i] == '+'){ 33 // 系数为土1的情况 34 if(str[i + 1] == 'n') b[n] = (str[i] == '+') ? 1 : -1; 35 else{ 36 int j = i + 1; b[n] = 0; 37 // 计算该项的系数 38 while('0' <= str[j] && str[j] <= '9') 39 b[n] = b[n] * 10 + str[j] - '0',j++; 40 b[n] = (str[i] == '+') ? b[n] : -b[n]; 41 i = j - 1; 42 } 43 } 44 else // 读取的是多项式的最高项(第一项) 45 if(str[i] == 'n') b[n] = 1,i--; 46 else{ 47 int j = i; b[n] = 0; 48 while('0' <= str[j] && str[j] <= '9') 49 b[n] = b[n] * 10 + str[j] - '0',j++; 50 i = j - 1; 51 } 52 if(str[i + 1] == 'n'){ 53 if(str[i + 2] == '^'){ 54 int j = i + 3 ; a[n] = 0; 55 // 计算该项的指数 56 while ('0' <= str[j] && str[j] <= '9') 57 a[n] = a[n] * 10 + str[j] - '0',j++; 58 i = j - 1; 59 } 60 else a[n] = 1,i++; 61 } 62 else a[n] = 0; 63 } 64 i += 2; d = 0; 65 for ( ; i < L ; i++) d = d * 10 + str[i] - '0'; 66 int Flag = 1; 67 for (int i = 1 ; i <= a[1] + 1 ; i++) 68 if(Calc(i)) Flag = 0; 69 if (Flag)puts("Always an integer"); 70 else puts("Not always an integer"); 71 } 72 return 0; 73 }