题目描述
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.