Combinatorics is a branch of mathematics chie y 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
an- other? 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 rst
question above is n ( n
解法一【随机化】见【这里】。
设最高次数为k,只需要代入n=1,2,…,k+1验证。
证明如下:
k=0,显然只需要带入p(1)。
k>=1,可以发现首项和相邻两项的差都能整除d就是整个数列能整除d的充要条件。差分数列f(n)=p(n+1)-p(n)是一个k-1次项式,根据归纳法可以知道需要需要保证f(1),f(2),..,f(k)全能整除d,再加上p(1)能整除d,也就是p(1),p(2),…,p(k+1)能整除d。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define LL long long
const int T=10000;
LL a[110],t[110],d,r[10010];
char s[100010];
int n;
bool init()
{
int x,f,p=0;
char c;
scanf("%s",s);
c=s[p++];
if (c=='.') return 0;
n=0;
c=s[p++];
while (c!=')')
{
n++;
if (c=='-')
{
f=-1;
c=s[p++];
}
else f=1;
if (c=='+') c=s[p++];
x=0;
while (c>='0'&&c<='9')
{
x=x*10+c-'0';
c=s[p++];
}
if (!x) x=1;
x*=f;
a[n]=x;
if (c!='n')
{
t[n]=0;
continue;
}
c=s[p++];
x=0;
if (c=='^')
{
c=s[p++];
while (c>='0'&&c<='9')
{
x=x*10+c-'0';
c=s[p++];
}
}
else x=1;
t[n]=x;
}
c=s[p++];
c=s[p++];
x=0;
while (c>='0'&&c<='9')
{
x=x*10+c-'0';
c=s[p++];
}
d=x;
return 1;
}
LL pow(LL base,LL p)
{
LL ret=1;
while (p)
{
if (p&1) ret=ret*base%d;
base=base*base%d;
p>>=1;
}
return ret;
}
bool solve()
{
int i,j;
LL x;
for (i=1;i<=T;i++)
{
x=0;
for (j=1;j<=n;j++)
x=((x+pow(r[i],t[j])*a[j]%d)%d+d)%d;
if (x) return 0;
}
return 1;
}
void make()
{
int i;
srand(123);
for (i=1;i<=T;i++)
r[i]=rand();
}
int main()
{
int K=0;
make();
while (init())
{
printf("Case %d: ",++K);
if (solve()) printf("Always an integer\n");
else printf("Not always an integer\n");
}
}