A93199.「MtOI2019」幻想乡数学竞赛
省选/NOI-
通过率:0%
时间限制:1.00s
内存限制:128MB
题目描述
一年一度的幻想乡数学竞赛 (thMO) 又要开始了。
幻想乡中学习数学的少 (lao) 女 (tai) 们 (po) 和冰之妖精 baka 一起准备着 thMO。
但是在那一刻,幻想乡日复一日的宁静被打破了。
广播里,播放起了死亡的歌曲!
在那一刻,人们又回想起了被算数支配的恐惧。
就剩下 baka,baka,baka,baka 的声音在幻想乡里回荡。
河城 荷取 (Kawashiro Nitori) 正坐在 thMO2019 的考场上!
因为荷取有着她的超级计算机,在成功地用光学迷彩覆盖了计算机之后,荷取在 thMO2019 的考场上所向披靡。
-
荷取用她的超级计算机 0ms 跑出了这么一道题:
- ∃{an}(n=0,1,⋯,1018),已知 a0=2,a1=5,an+2=3an+1−2an,求 anmod109+7
-
荷取:显然,这个题可以用矩阵乘法 + 快速幂,可以 O(logn) 水过去,差不多就这样:
[anan+1]=[a1a2]×[3−210]n
但是荷取遇到了一道她不会的题,她正在寻求你的帮助呢!
存在一个数列 {an}(n∈{0,1,2,⋯,264−1})。
已知 a0=−3,a1=−6,a2=−12,an=3an−1+an−2−3an−3+3n。
-
现在给你一个非负整数 n ,令 p=109+7,请你求出 anmodp。
-
注:若 an<0 ,请输出 (anmodp+p)modp。
为了更充分地考验你的水平,荷取设置了 T 组询问。
- 为了在某种程度上减少你的输入和输出量,我们采用以下的代码来生成询问:
namespace Mker
{
// Powered By Kawashiro_Nitori
// Made In Gensokyo, Nihon
#include<climits>
#define ull unsigned long long
#define uint unsigned int
ull sd;int op;
inline void init() {scanf("%llu %d", &sd, &op);}
inline ull ull_rand()
{
sd ^= sd << 43;
sd ^= sd >> 29;
sd ^= sd << 34;
return sd;
}
inline ull rand()
{
if (op == 0) return ull_rand() % USHRT_MAX + 1;
if (op == 1) return ull_rand() % UINT_MAX + 1;
if (op == 2) return ull_rand();
}
}
在调用 Mker::init() 函数之后,你第 i 次调用 Mker::rand() 函数时返回的便是第 i 次询问的 ni。
在这里给出 op 的限制:
-
如果 op=0,满足 ni≤216。
-
如果 op=1,满足 ni≤232。
-
如果 op=2,满足 ni≤264−1。
为了减少你的输出量,你只需要输出所有询问答案的异或和。
输入格式
第一行三个整数,输入 T,seed 和 op。
输出格式
第一行一个整数,输出 T 组询问的答案的异或和。
输入输出样例
输入#1
142857 1145141919 0
输出#1
562611141
输入#2
142857 1145141919 1
输出#2
894946216
输入#3
142857 1145141919 2
输出#3
771134436
说明/提示
子任务
| 测试点编号 | T | seed | op |
|---|---|---|---|
| 1 | ≤107 | =0 | 2 |
| 2−3 | ≤5×106 | =5201314 | 0 |
| 4−5 | ≤106 | ≤232−1 | 1 |
| 6 | ≤5×106 | ≤232−1 | 2 |
| 7 | ≤8×106 | ≤232−1 | 2 |
| 8−10 | ≤107 | ≤232−1 | 2 |
| 11 | ≤2×107 | ≤232−1 | 0 |
| 12 | ≤2×107 | =1145141919 | 1 |
| 13−20 | ≤5×107 | ≤232−1 | 2 |
题目来源
迷途之家 2019 联赛 (MtOI2019) T4
出题人:disangan233
验题人:suwakow