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)即可。
计算多项式的值可以用高中数学课本讲到过的秦九韶算法。
代码君
给出一个形如(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; }
代码君
相关文章推荐
- UVALive 4119 Always an integer (差分数列,模拟)
- LA 4119 Always an integer (数论+模拟)
- LA 4119 - Always an integer
- LA 4119 Always an integer (数学)
- UVALive 4119 Always an integer(差分数列+模拟)
- worldfinals 2008 Always an integer
- uva 1069 - Always an integer(数学+暴力)
- uva1069 Always an integer【解法一】
- uva1069 Always an integer【解法二】
- UVA 1069 - Always an integer(数论)
- LA4119 -- Always an integer
- UVA - 1069 Always an integer (模拟)
- uvaoj 1069 Always an integer
- 2008 world final B (Always an Integer)
- uva1069 - Always an integer
- UVA 1069 - Always an integer(数论)
- [LeetCode] 无序数组中的最长连续数列 The Longest Consecutive Sequence in an unsorted array
- 初等代数(2):不等式、数列与简单级数、阶乘、排列组合、二项式与多项式
- test if a string is an integer?
- switch语句: 编译错误case label does not reduce to an integer constant