• 【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.
  • 相关阅读:
    [BZOJ2882] 工艺
    团队项目成员和题目
    软件工程课堂作业(最小数组和)
    每周进度条(第六周)
    梦断代码阅读笔记01
    每周进度条(第五周)
    每周进度条(第四周)
    软件工程个人作业03
    软件工程个人作业02
    每周进度条(第三周)
  • 原文地址:https://www.cnblogs.com/myx12345/p/6490283.html
Copyright © 2020-2023  润新知