poj3233

这道题其实算是把快速幂的思想用在多项式之中

A+A^2+A^3+…+A^n=(A+A^1…+A^[n/2])+A^[n/2](A+A+A^1…+A^[n/2])+n mod 2*A^n

然后就是打码的问题了

 1 var ans,a,b,c,f:array[0..30,0..30] of longint;
 2     d:array[0..30] of longint;
 3     i,j,n,m,p:longint;
 4 
 5 procedure mul;
 6   var i,j,k:longint;
 7   begin
 8     for i:=1 to n do
 9       for j:=1 to n do
10       begin
11         c[i,j]:=0;
12         for k:=1 to n do
13           c[i,j]:=(c[i,j]+a[i,k]*b[k,j] mod p) mod p;
14       end;
15   end;
16 
17 procedure add;
18   var i,j:longint;
19   begin
20     for i:=1 to n do
21       for j:=1 to n do
22         ans[i,j]:=(ans[i,j]+c[i,j]) mod p;
23   end;
24 
25 procedure quick(x:longint);
26   var i,j:longint;
27   begin
28     j:=0;
29     while x<>0 do
30     begin
31       inc(j);
32       d[j]:=x mod 2;
33       x:=x shr 1;
34     end;
35     fillchar(c,sizeof(c),0);
36     for i:=1 to n do
37       c[i,i]:=1;
38     for i:=j downto 1 do
39     begin
40       a:=c;
41       b:=c;
42       mul;
43       if d[i]=1 then
44       begin
45         a:=c;
46         b:=f;
47         mul;
48       end;
49     end;
50   end;
51 
52 procedure work(x:longint);
53   begin
54     if x=1 then ans:=f
55     else begin
56       work(x shr 1);
57       quick(x shr 1);
58       a:=c;
59       b:=ans;
60       mul;
61       add;
62       if x mod 2=1 then
63       begin
64         quick(x);
65         add;
66       end;
67     end;
68   end;
69 
70 begin
71   readln(n,m,p);
72   for i:=1 to n do
73     for j:=1 to n do
74       read(f[i,j]);
75   work(m);
76   for i:=1 to n do
77   begin
78     for j:=1 to n do
79     begin
80       write(ans[i,j]);
81       if j<>n then write(' ');
82     end;
83     writeln;
84   end;
85 end.
View Code
原文地址:https://www.cnblogs.com/phile/p/4473047.html