P2012 拯救世界2

题目背景

前三题太弱了嘛,在看看最后一道渣题。

题目描述

经过 12 年的韬光养晦,世界末日再次来临(众人:什么鬼逻辑......)。

这次,小a 和 uim 已经做好了一切准备,顺利召唤出了 kkksc03 大神和 lzn 大神。然而,kkksc03 和 lzn 告诉他们,这次世界末日太过强大,他们已无法挽回,只有创世神 JOHNKRAM 能拯救这个世界。

然而,创世神 JOHNKRAM 是无法召唤的,除非把整个宇宙按照 𝐸=𝑚𝑐2E=mc2 全部转化成能量。因为根据 C_SUNSHINE 大神随手推算出的召唤定律,至少需要被召唤者百万亿分之一的能量才能召唤(众人:什么鬼定律......)。


当然,还有一种方法,那就是找出创世神 JOHNKRAM 的基因序列。普通人基因序列由 A、C、G、T 构成,创世神 JOHNKRAM 不是普通人(是个胖纸),基因序列也不一样。除了这四种普通的,还有乾、兑、离、震、巽、坎、艮、坤八种特殊基因。其中乾、坎、艮、震属阳,只能出现奇数次;坤、兑、离、巽属阴,只能出现偶数次。

现在只知道创世神 JOHNKRAM 的基因序列共有 𝑛n 位,其他一概不知。小a 和 uim 想知道他们最多要试多少次,才能召唤出创世神 JOHNKRAM 。这个数字有可能很大,所以输出答案模 109109 即可(C_SUNSHINE 的忠告:远离八卦,远离肥胖)。

输入格式

输入由多组数据组成,每组数据一行,输入一个数 𝑛n,输入以 00 结束。

输出格式

对于每组数据,输出一行一个整数,表示答案对 109109 取模的结果。

输入输出样例

输入 #1

3
10
20
6
0

输出 #1

0
225116160
53238784
7680

说明/提示

【数据范围】
对于 10%10% 的数据:1≤𝑛<251≤n<25,数据不超过 1010 组;
对于 50%50% 的数据:1≤𝑛<2311≤n<231,数据不超过 103103 组;
对于 100%100% 的数据:1≤𝑛<2631≤n<263,数据不超过 2×1052×105 组。

【样例解释】
第一个数据解释:
只有 33 位,没有合法方案,故答案为 00。

【备注】

附件:聊天记录(纯粹扯淡)

JOHNKRAM 8:50:33

喂喂,坑神之赛2可以开始了吧

C_SUNSHINE 8:50:34

[自动回复]恩!

JOHNKRAM 8:51:12

我准备把最后一题数据从 5050 放到 263263。

C_SUNSHINE 8:51:12

[自动回复]恩!

JOHNKRAM 8:51:45

你同意喽?

C_SUNSHINE 8:51:46

[自动回复]恩!

C_SUNSHINE 11:58:50

你疯了吗?!

JOHNKRAM 11:58:52

[自动回复]您好,我现在有事不在,一会再和您联系。 不再提醒

Code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define ll long long
using namespace std;
const ll b[5]={0,0,0,0,24},T=20000,N=T+10,P=1e9,Phi=4e8;
ll n,pw2[N],pw3[N],Pw2[N],Pw3[N];
ll read(){
	ll x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
	while(isdigit(c))x=(x<<1)+(x<<3)+c-48,c=getchar();
	return x*f;
}
void print(ll x)
{if(x>9)print(x/10);putchar(x%10+48);return;}
ll G4(ll n)
{n%=Phi;return Pw2[n/T]*Pw2[n/T]%P*pw2[n%T]%P*pw2[n%T]%P;}
ll G8(ll n)
{n%=Phi;return Pw2[n/T]*pw2[n%T]%P*G4(n)%P;}
ll G12(ll n)
{n%=Phi;return Pw3[n/T]*pw3[n%T]%P*G4(n)%P;}
signed main()
{
	pw2[0]=pw3[0]=Pw2[0]=Pw3[0]=1;
	for(ll i=1;i<=T;i++)
		pw2[i]=pw2[i-1]*2ll%P,pw3[i]=pw3[i-1]*3ll%P;
	for(ll i=1;i<T;i++)
		Pw2[i]=Pw2[i-1]*pw2[T]%P,Pw3[i]=Pw3[i-1]*pw3[T]%P;
	while(1){
		n=read();
		if(!n)break;
		if(n<=4){print(b[n]),putchar('\n');continue;}
		ll ans=81ll*G12(n-4);
		ans=ans-G8(n-2);
		ans=ans+6ll*G4(n-4);
		ans=ans+((n&1)?-1:1)*G4(n-4);
		print((ans%P+P)%P);
		putchar('\n'); 
	}
	return 0;
}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值