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
随机若干个n代入验证。
正解见【这里】。
#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");
}
}

本文探讨了组合数学中常见的计数问题,并通过具体的例子解释了如何将问题简化为多项式表达。文中还提供了一段代码,用于验证给定的多项式表达式是否总是能够得到整数解。
382

被折叠的 条评论
为什么被折叠?



