两种思路

最容易想到的是快速幂和排列组合直接模拟操作,现附上代码:
const p=10007;maxk=1000;
var a,b,k,n,m:longint;
function C(k,m:longint):longint;
var f:array[0..maxk,0..maxk] of longint;
i,j,n:longint;
begin
n:=k-m;
if(n=0)or(m=0)then exit(1);
for i:=0 to n do f[i][0]:=1;
for j:=0 to m do f[0][j]:=1;
for i:=1 to n do
for j:=1 to m do
f[i][j]:=(f[i-1][j]+f[i][j-1])mod p;
exit(f[n][m]);
end;
function exp(a,b:longint):longint;
var ans,temp:int64;
begin
ans:=1;temp:=a;
while b<>0 do
begin
if((b and 1)=1)then ans:=(ans*temp)mod p;
temp:=(temp*temp)mod p;
b:=b shr 1;
end;
exit(ans);
end;
begin
readln(a,b,k,n,m);
if(n=0)and(m=0)
then begin
writeln(0);
halt;
end;
a:=a mod p;b:=b mod p;
writeln(C(k,m)*int64(exp(a,n))*exp(b,m) mod p);
end.
但是还有一种数学方法,不会超时,本人不是很懂:
var
f:array[-1..1001,-1..1001] of longint;
a,b,m,n,k,i,j:longint;
begin
readln(a,b,k,n,m);
f[1,0]:=b;
f[1,1]:=a;
for i:=2 to k do
for j:=0 to k do
f[i,j]:=(f[i-1,j]*b+f[i-1,j-1]*a) mod 10007;
writeln(f[k,n]);
end.

6 条评论

  • 1

信息

ID
1739
难度
6
分类
数论 点击显示
标签
递交数
3863
已通过
1096
通过率
28%
被复制
15
上传者