题目描述 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题,只是要高精度(因为内存,我高精度压了十多位)
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.
时间: 2024-11-16 23:27:14