【ZJOI2017 Round1练习】D2T2 iqtest(排列组合)

题意:

思路:

根据欧拉定理,a^(phi(n)-1)为a mod n的逆元

 1 var prime,cnt:array[1..100]of longint;
 2     s,ans,x,mo,k,phi,tmp:int64;
 3     i,m,n,j:longint;
 4 
 5 function mult(x,y:int64):int64;
 6 var tmp:int64;
 7 begin
 8  tmp:=x;
 9  mult:=1;
10  while y>0 do
11  begin
12   if y and 1=1 then mult:=mult*tmp mod mo;
13   tmp:=tmp*tmp mod mo;
14   y:=y>>1;
15  end;
16 end;
17 
18 function ins(x,y:longint):longint;
19 var i:longint;
20 begin
21  for i:=1 to m do
22   while x mod prime[i]=0 do
23   begin
24    cnt[i]:=cnt[i]+y;
25    x:=x div prime[i];
26   end;
27  exit(x);
28 end;
29 
30 begin
31  assign(input,'iqtest.in'); reset(input);
32  assign(output,'iqtest.out'); rewrite(output);
33  readln(n,mo);
34  k:=mo; phi:=mo;
35  for i:=2 to trunc(sqrt(mo)) do
36   if k mod i=0 then
37   begin
38    inc(m); prime[m]:=i; phi:=phi div i*(i-1); k:=k div i;
39    while k mod i=0 do k:=k div i;
40   end;
41  if k>1 then begin inc(m); prime[m]:=k; phi:=phi div k*(k-1); end;
42  s:=1;
43  for i:=1 to n do
44  begin
45   tmp:=s;
46   for j:=1 to m do tmp:=tmp*mult(prime[j],cnt[j]) mod mo;
47   read(x);
48   ans:=(ans+tmp*x mod mo) mod mo;
49   if i<n then s:=s*ins(n-i,1) mod mo*mult(ins(i,-1),phi-1) mod mo;
50  end;
51  writeln(ans);
52  close(input);
53  close(output);
54 end.
原文地址:https://www.cnblogs.com/myx12345/p/6490283.html