挑战nbc

题目描述
Abwad是一名有志向的优秀OI少年。遗憾的是,由于高能宇宙射线的影响,他不幸在NOI中滚粗。不过,Abwad才高一,还有许许多多的机会。在长时间的刻苦学习之后,他实力大增,并企图撼动OI界魔王nbc的权威。
这一天,Abwad决定挑战nbc。挑战的项目是OI界一种常见的运动:造题,比的就是谁造得又快又好。Abwad现在拿到了难度为1,2,3,……,n的n道原题,每次操作他可以挑出任意两道题,并使用一种叫做“NOIP二合一”的方法合成一道难度为其平均值的题。Abwad希望在操作了n-1次之后,最后剩下的那道题难度最大。
输入
一行一个整数,表示n。

输出
一行一个整数ans,若答案的最简分数为x/y,ans应为最小的满足ans*y mod 1000000007=x的整数。(其实就是分数取模辣)

样例输入
2
样例输出
500000005

数据丢了,不过应该有10^18。
我推了个矩阵,不过好像还有更强的公式。

const p=1000000007;
type al=array[0..3,0..3] of int64;
var
a,f:al;
n,i,j:longint;
x,y:int64;
function chen(x,y:al):al;
var
i,j,k:longint;
begin
  for i:=1 to 3 do
    for j:=1 to 3 do
    begin
      chen[i,j]:=0;
      for k:=1 to 3 do
        chen[i,j]:=(chen[i,j]+x[i,k]*y[k,j]) mod p;
    end;
end;

function gpow(k:longint):al;
var
t:al;
begin
  if k=1 then exit(a);
  t:=gpow(k div 2);
  t:=chen(t,t);
  if k mod 2=1 then t:=chen(t,a);
  exit(t);
end;

function pow(k,x:longint):int64;
var
t:int64;
begin
  if k=1 then exit(x);
  t:=pow(k div 2,x);
  t:=t*t mod p;
  if k mod 2=1 then t:=t*x mod p;
  exit(t);
end;

begin
  read(n);
  a[1,1]:=1;a[1,2]:=2;a[1,3]:=1;
  a[2,1]:=0;a[2,2]:=2;a[2,3]:=1;
  a[3,1]:=0;a[3,2]:=0;a[3,3]:=2;
  if n=1 then begin write('1'); exit; end;
  if n=2 then begin write('500000005'); exit; end;
  a:=gpow(n-2);
  f[1,1]:=2;
  f[2,1]:=2;
  f[3,1]:=2;
  f:=chen(a,f);
  x:=(f[1,1]+1) mod p;
  y:=pow(n-1,2);
  write(x*pow(p-2,y) mod p);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值