题目描述 Description
佳佳碰到了一个难题,请你来帮忙解决。对于不定方程a1+a2+… +ak-1 +ak=g(x),其中k≥2且k ∈ N*,x是正整数,g(x) =xx mod 1000(即xx除以1000的余数),x,k是给定的数。我们要求的是这个不定方程的正整数解组数。举例来说,当k=3, x=2时,分别为(a1,a2,a3)=(2,1,1),(1,2,1),(1,1,2)。
输入描述 Input Description
输人只有一行,为用空格隔开的两个正整数,依次为k,x。
输出描述 Output Description
输出只有一行,为方程的正整数解组数。
样例输入 Sample Input
3 2
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
【数据范围】
对于40%的数据,ans ≤ 1016;
对于100%的数据,k≤ 100,x≤231一1,k ≤g (x)。
傻逼dp题,只是要高精度(因为内存,我高精度压了十多位)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 const 2 maxn=1010; 3 h=100000000000000000; 4 type 5 big=array[0..10]of int64; 6 var 7 f,s:array[0..maxn,0..maxn]of big; 8 n,k:int64; 9 10 function q(x,y:int64):int64; 11 begin 12 if y=0 then exit(1); 13 q:=q(x,y>>1); 14 q:=q*q mod 1000; 15 if y and 1=1 then q:=q*x mod 1000; 16 end; 17 18 operator +(a,b:big)c:big; 19 var 20 i:longint; 21 begin 22 c:=a; 23 for i:=1 to b[0] do 24 inc(c[i],b[i]); 25 if c[0]<b[0] then c[0]:=b[0]; 26 for i:=1 to c[0]-1 do 27 begin 28 inc(c[i+1],c[i]div h); 29 c[i]:=c[i]mod h; 30 end; 31 i:=c[0]; 32 while c[i]>=h do 33 begin 34 c[i+1]:=c[i]div h; 35 c[i]:=c[i]mod h; 36 inc(c[0]); 37 end; 38 end; 39 40 procedure print(a:big); 41 var 42 i:longint; 43 k:int64; 44 begin 45 write(a[a[0]]); 46 for i:=a[0]-1 downto 1 do 47 begin 48 k:=h; 49 while k>10 do 50 begin 51 k:=k div 10; 52 if a[i]<k then write(0); 53 end; 54 write(a[i]); 55 end; 56 end; 57 58 procedure main; 59 var 60 i,j:longint; 61 begin 62 read(n,k); 63 k:=q(k,k); 64 for i:=0 to k do 65 begin 66 s[0,i][0]:=1; 67 s[0,i][1]:=1; 68 end; 69 for i:=1 to n do 70 begin 71 for j:=k downto i do 72 f[i,j]:=s[i-1,j-1]; 73 for j:=i to k do 74 s[i,j]:=f[i,j]+s[i,j-1]; 75 end; 76 print(f[n,k]); 77 end; 78 79 begin 80 main; 81 end.