zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    顺序栈的模拟
    Maven安装教程详解
    C# CRC
    Oracle知识分类之常见规范
    Oracle知识分类之异常
    el-tree树结构的数据封装
    sessionStorage和localStorage
    el-form 中为el-input 添加正则校验 以及el-input正则限制
    动态组件与父子传值的灵活应用 ref控制子组件 props,emit传值
    el-tree树组件的封装 (运用递归对接口返回当前菜单数据为对象处理)
  • 原文地址:https://www.cnblogs.com/cyb123456/p/5806706.html
Copyright © 2011-2022 走看看