UVALive 4119 Always an integer (差分数列,模拟)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud
Always an integer
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu
Combinatorics is a branch of mathematics chiefly concerned with counting discrete objects. For instance, how many ways can you pick two people out of a crowd of n people? Into how many regions can you divide a circular disk by connecting n points on its boundary with one another? How many cubes are in a pyramid with square layers ranging from 1×1 to n×n cubes?

Many questions like these have answers that can be reduced to simple polynomials in n . The answer to the first question above is n(n - 1)/2 , or (n
2 - n)/2 . The answer to the second is (n
4 - 6n
3 + 23n
2 - 18n + 24)/24 . The answer to the third is n(n + 1)(2n + 1)/6 , or (2n
3 + 3n
2 + n)/6 . We write these polynomials in a standard form, as a polynomial with integer coefficients divided by a positive integer denominator.
These polynomials are answers to questions that can have integer answers only. But since they have fractional coefficients, they look as if they could produce non-integer results! Of course, evaluating these particular polynomials on a positive integer always results in an integer. For other polynomials of similar form, this is not necessarily true. It can be hard to tell the two cases apart. So that, naturally, is your task.
Input
The input consists of multiple test cases, each on a separate line. Each test case is an expression in the form (P)/D , where P is a polynomial with integer coefficients and D is a positive integer denominator. P is a sum of terms of the form Cn
E , where the coefficient C and the exponent E satisfy the following conditions:
- E is an integer satisfying 0
E
100 . If E is 0, then Cn
E is expressed as C . If E is 1, then Cn
E is expressed as Cn , unless C is 1 or -1. In those instances, Cn
E is expressed as n or - n . - C is an integer. If C is 1 or -1 and E is not 0 or 1, then the Cn
E will appear as n
E or - n
E . - Only non-negative C values that are not part of the first term in the polynomial are preceded by +.
- Exponents in consecutive terms are strictly decreasing.
- C and D fit in a 32-bit signed integer.
See the sample input for details.
Input is terminated by a line containing a single period.
Output
For each test case, print the case number (starting with 1). Then print `Always an integer' if the test case polynomial evaluates to an integer for every positive integer n . Print ` Not always an integer' otherwise. Print the output for separate test cases on separate lines. Your output should follow the same format as the sample output.
Sample Input
(n^2-n)/2
(2n^3+3n^2+n)/6
(-n^14-11n+1)/3
.
Sample Output
Case 1: Always an integer
Case 2: Always an integer
Case 3: Not always an integer
题目的意思是让你判断一个整系数多项式的值是否一直都能被一个所给的正整数所整除。
通过对差分数列的不断求导,我们可以发现,对于任意多项式P,我们只需要判断从1到k+1是否满足就行了,其中,k为多项式P中的最高次数。
接下来就是纯模拟了。
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
string s;
vector<pair<long long,long long> >vec;
long long fast_mod(long long m,long long n,long long fenm)
{
long long ret=;
long long temp=m;
while(n)
{
if(n&)
{
ret=ret*temp;
ret%=fenm;
}
temp=temp*temp;
temp%=fenm;
n>>=;
}
return ret;
}
int main()
{
ios::sync_with_stdio(false);
int cas=;
//freopen("in.in","r",stdin);
while(cin>>s)
{
if(s==".")break;
int len=s.length();
vec.clear();
int pos=;
while(pos<len&&s[pos]!='/')pos++;
long long fenm=;
int index=pos+;
while(index<len) fenm=s[index++]-''+fenm*;
if(fenm==)fenm=;
long long a,b;
long long maxx=;
bool chac=;
for(int i=;i<pos;)
{
chac=;
a=,b=;
if(s[i]=='(')i++;
if(s[i]==')'||s[i]=='/')break;
if(s[i]=='+'||s[i]=='-')
{
if(s[i]=='-')chac=;
i++;
}
while(i<pos&&s[i]!='/'&&s[i]!='n'&&s[i]!=')')
{
a*=;
a+=s[i++]-'';
}
if(a==)a=;
if(chac)a*=-;
if(s[i]=='/'||s[i]==')')
{
vec.push_back(make_pair(a,));
break;
}
i++;
if(s[i]=='^')i++;
while(i<pos&&s[i]>=''&&s[i]<='')
{
b*=;
b+=s[i++]-'';
}
if(b==)b=;
vec.push_back(make_pair(a,b));
maxx=max(b,maxx);
}
bool flag=;
long long temp;
for(int i=;i<=maxx+;i++)
{
temp=;
for(int j=;j<vec.size();j++)
{
temp+=(vec[j].first*fast_mod(i,vec[j].second,fenm))%fenm;
temp%=fenm;
}
if(temp){flag=;break;}
}
cout<<"Case "<<cas++<<": ";
if(flag)cout<<"Not always an integer"<<endl;
else cout<<"Always an integer"<<endl;
s.clear();
}
return ;
}
UVALive 4119 Always an integer (差分数列,模拟)的更多相关文章
- LA 4119 Always an integer (数论+模拟)
ACM-ICPC Live Archive 一道模拟题,题意是问一个给出的多项式代入正整数得到的值是否总是整数. 这题是一道数论题,其实对于这个式子,我们只要计算1~最高次项是否都满足即可. 做的时候 ...
- CF460C Present (二分 + 差分数列)
Codeforces Round #262 (Div. 2) C C - Present C. Present time limit per test 2 seconds memory limit p ...
- hdu4970 Killing Monsters (差分数列)
2014多校9 1011 http://acm.hdu.edu.cn/showproblem.php?pid=4970 Killing Monsters Time Limit: 2000/1000 M ...
- uvalive 4119 Always an Interger
差分数列+字符串处理 题意:是让你判断一个整系数多项式的值是否一直都能被一个所给的正整数所整除. 通过对差分数列的不断求导,我们可以发现,对于任意多项式P,我们只需要判断n从1到k+1是否满足就行了, ...
- [CF 295A]Grag and Array[差分数列]
题意: 有数列a[ ]; 操作op[ ] = { l, r, d }; 询问q[ ] = { x, y }; 操作表示对a的[ l, r ] 区间上每个数增加d; 询问表示执行[ x, y ]之间的o ...
- [CF 276C]Little Girl and Maximum Sum[差分数列]
题意: 给出n项的数列A[ ], q个询问, 询问 [ l, r ] 之间项的和. 求A的全排列中该和的最大值. 思路: 记录所有询问, 利用差分数列qd[ ], 标记第 i 项被询问的次数( 每次区 ...
- LA 4119 (差分数列 多项式) Always an integer
题意: 给出一个形如(P)/D的多项式,其中P是n的整系数多项式,D为整数. 问是否对于所有的正整数n,该多项式的值都是整数. 分析: 可以用数学归纳法证明,若P(n)是k次多项式,则P(n+1) - ...
- Always an integer UVALive - 4119
题目很简单,就是求表达式(P/D)的结果是不是整数.其中P是一个整系数的多项式,D是一个正整数. 把1-k(最高次)+1都试一次就好了.结论可以总结归纳得到.(k取 0, 1, 2 .... 的情况推 ...
- UVALive 5888 Stack Machine Executor (栈+模拟)
Stack Machine Executor 题目链接: http://acm.hust.edu.cn/vjudge/problem/26636 Description http://7xjob4.c ...
随机推荐
- poj3273 二分
Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21448 Accepted: 8429 ...
- 自定义VIew基础
一.坐标 ①.通过View获取坐标,通过调用getLeft().getRight()...方法获取坐标. 1.获取到的是相对于View父控件的位置 2.指的是左上角和右下角的x,y值 3.View还提 ...
- 搬寝室(HDU 1421 DP)
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- 九章算法系列(#3 Binary Tree & Divide Conquer)-课堂笔记
前言 第一天的算法都还没有缓过来,直接就进入了第二天的算法学习.前一天一直在整理Binary Search的笔记,也没有提前预习一下,好在Binary Tree算是自己最熟的地方了吧(LeetCode ...
- window系统查看端口被哪个进程占用
---恢复内容开始--- 1.在cmd窗口运行 netstat -ano | findstr 1099 找到进程PID 8408 杀死进程:taskkill -F -PID 8408 2.另外还找到进 ...
- 编译不通过:提示XXXX不是类或命名空间名 的解决办法
手动写了一个类,需要引入预编译头stdafx.h.结果编译时提示XXXX不是类或命名空间名. 处理方法:将#include "stdafx.h"放在最前面.
- (转)linux下fork的运行机制
转载http://www.cnblogs.com/leoo2sk/archive/2009/12/11/talk-about-fork-in-linux.html 给出如下C程序,在linux下使用g ...
- Angular学习笔记(2)——TODO小应用
Angular学习笔记(2)--TODO小应用 1. 写在前面 之前我们跑了Angular的Hello World,你是不是对它有点感觉了呢?这一篇将结合一个TODO程序来继续学习Angular的用法 ...
- Eclipse代理设置
这段时间公司实行代理上网,不仅通过浏览器上网须要不停的输入username和password,在本地调试程序时候Eclipse居然也弹出框让输入username和password. 如图: 解决的方法 ...
- Java实现将指定目录内的指定类型的文件归类
这两天在学Java IO流,正好让我产生了将自己的电子书归类的打算,说做就做,Why not?看着自己所学所用能解决生活中的实际问题,是不是非常有成就感,那是必须的! package DepthSea ...