您的位置:首页 > 其它

LA 4119 (差分数列 多项式) Always an integer

2015-03-07 17:21 375 查看
题意:

给出一个形如(P)/D的多项式,其中P是n的整系数多项式,D为整数。

问是否对于所有的正整数n,该多项式的值都是整数。

分析:

可以用数学归纳法证明,若P(n)是k次多项式,则P(n+1) - P(n)为k-1次多项式。

P是n的一次多项式时,P是一个等差数列,只要验证P(1)和P(2)是D的倍数即可。

P是n的二次多项式时,只要验证第一项为D的倍数,且相邻两项的差值也是D的倍数即可。相邻两项的差值为一次多项式,所以要验证两项,加上前面验证的第一项,所以共验证P(1)、P(2)和P(3)三项。

一般地,要验证k次多项式,只要验证P(1)...P(k+1)即可。

计算多项式的值可以用高中数学课本讲到过的秦九韶算法。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;

const int maxn = 100 + 10;
int a[maxn], p;//a[i]表示n^i对应的系数,p为最高系数

void parse_polynomial(string s)
{
int i = 0, len = s.size();
while(i < len)
{
int sign = 1;
if(s[i] == '+') i++;
if(s[i] == '-') { i++; sign = -1; }
int v = 0;//系数
while(i < len && isdigit(s[i])) v = v * 10 + s[i++] - '0';
v *= sign;
if(i == len) a[0] = v;//常数项
else
{
if(v == 0) v = sign;
int u = 1;//没有指数
if(s[++i] == '^')//有指数
{
u = 0;
i++;
while(isdigit(s[i])) u = u * 10 + s[i++] - '0';
}
a[u] = v;
if(u > p) p = u;
}
}
}

int mod(int x, int MOD)
{
int ans = 0;
for(int i = p; i >= 0; i--)
{
ans = (long long) ans * x % MOD;//注意不要溢出
ans = ((long long) ans + a[i]) % MOD;
}
return ans;
}

bool check(string& expr)
{
int p = expr.find('/');
parse_polynomial(expr.substr(1, p-2));
int D = atoi(expr.substr(p+1).c_str());
for(int i = 1; i <= p+1; i++)
if(mod(i, D) != 0) return false;
return true;
}

int main()
{
//freopen("in.txt", "r", stdin);

int kase = 1;
string expr;
while(cin >> expr)
{
if(expr[0] == '.') break;
memset(a, 0, sizeof(a));
p = 0;
printf("Case %d: %s\n", kase++, check(expr) ? "Always an integer" : "Not always an integer");
}

return 0;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: