1654 方程的解 - Wikioi

题目描述 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.
View Code

 

你可能感兴趣的:(IO)