LA4119

题意:

       判断一个关于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 }
View Code

 

posted @ 2016-08-25 14:38  Yan_Bin  阅读(188)  评论(0编辑  收藏  举报