您的位置:首页 > 其它

uva1069 Always an integer【解法一】

2016-12-17 16:59 381 查看
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
=x;
if (c!='n')
{
t
=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
=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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  随机化