Codeforces Round #362 (Div. 1) C PLEASE

原题网址:http://codeforces.com/contest/696/problem/C
这里写图片描述
这里写图片描述
假设交换i次后key在中间的概率为f(i),在左边的概率为g(i),因为左右两边等价,在右边的概率也为g(i)。所以g(i)=(1-f(i))/2。
f(i)=1/2g(i-1)+1/2g(i-1)=g(i-1)=(1-f(i-1))/2=-1/2f(i-1)+1/2
有了递推公式f(i)=-1/2f(i-1)+1/2,可以求出通项公式
设f(i)+λ=-1/2*(f(i-1)+(1/2+λ)/(-1/2))
λ=(1/2+λ)/(-1/2)
解得λ=-1/3
所以f(i)-1/3=-1/2(f(i-1)-1/3)
令h(i)=f(i)-1/3
则h(i)=-1/2h(i-1),h(0)=f(0)-1/3=2/3
h(i)=(2/3)*(-1/2)^i
f(i)=(2/3)*(-1/2)^i+1/3=[2^(i-1)+(-1)^i]/[3*2^(i-1)]
此时的分子是奇数,不能被因子2整除,但是否可以被3整除需要考虑。
考虑i-1=2n和i-1=2n+1(n为正整数)两种情况
首先2^1≡-1(mod 3) 2^2≡1(mod 3)
1’ i-1=2n
2^(i-1)+(-1)^i≡2^2n+(-1)^(2n+1)≡(2^2)^n-1≡1^n-1≡0 (mod 3)
2’ i-1=2n+1
2^(i-1)+(-1)^i≡2^(2n+1)+(-1)^2n≡(2^2)^n*2+1≡1^n*(-1)+1≡0 (mod 3)
所以分子能被3整除,所以取模之前要约分
x=(2^(i-1)+(-1)^i)*3^(p-2)
y=2^(i-1)
又因为题目给的i特别大,甚至以乘积表示,因为2^(p-1)≡1 (mod p),所以只要让i不断对(p-1)取模即可

const
  p=1000000007;
  q=1000000006;
var
  n:longint;
  k,f,t,ny:int64;
function ksm(d,k:int64):longint;
  var
    t,w,ans:int64;
  begin
    t:=d;w:=1;ans:=1;
    while w<=k do
      begin
        if w and k>0
          then ans:=(ans*t) mod p;
        t:=(t*t) mod p;w:=w<<1;
      end;
    exit(ans);  
  end;
begin
  readln(n);
  k:=1;
  repeat
    read(t);dec(n);
    k:=k*(t mod q) mod q;
  until n=0;
  if k=0 then k:=q;
  if k and 1=0
    then f:=1
    else f:=-1;
  t:=ksm(2,k-1);
  ny:=ksm(3,p-2);
  writeln((t+f)*ny mod p,'/',t);  
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值