题意:

【BZOJ4870】组合数问题(计数DP,快速幂)

1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1

思路:From http://blog.csdn.net/qq_33229466/article/details/70665582

实际上就是要我们从)

还有一种更棒的做法,同样是dp,但可以发现)

 1 type arr=array[0..60]of int64;
 2 var ans,c,a:arr;
 3     n,p,k,r,t:int64;
 4 
 5 procedure dp(var a:arr;b:arr);
 6 var i,j:longint;
 7 begin
 8  for i:=0 to k-1 do c[i]:=0;
 9  for i:=0 to k-1 do
10   for j:=0 to k-1 do
11    c[(i+j) mod k]:=(c[(i+j) mod k]+a[i]*b[j] mod p) mod p;
12  for i:=0 to k-1 do a[i]:=c[i];
13 end;
14 
15 begin
16  assign(input,'bzoj4870.in'); reset(input);
17  assign(output,'bzoj4870.out'); rewrite(output);
18  read(n,p,k,r);
19  inc(ans[0]); inc(ans[1 mod k]);
20  a:=ans; t:=n*k-1;
21  while t>0 do
22  begin
23   if t and 1=1 then dp(ans,a);
24   dp(a,a);
25   t:=t>>1;
26  end;
27  writeln(ans[r]);
28 
29  close(input);
30  close(output);
31 end.

 

相关文章:

  • 2022-02-21
  • 2021-11-22
  • 2021-08-19
  • 2021-10-27
  • 2022-03-02
  • 2021-07-10
  • 2021-11-18
  • 2021-06-02
猜你喜欢
  • 2021-09-30
  • 2021-06-25
  • 2022-12-23
  • 2021-12-01
  • 2021-08-19
  • 2021-12-29
相关资源
相似解决方案