问题虫洞: The Nth Item
黑洞内窥:
BZ比较lan~~~~~~~
思维光年:
找出mod998244353的循环节,然后矩阵快速幂暴力。。
然而, 我并没有找到mod的循环节,所以,,
矩阵快速幂暴力会t。。。。。
这时候我们可以大胆假设,如果p>5000,就异或完了所有的Ai。
然后莽。。。。。。就完(AC)了,(其实是数据太水了~~~)
理性的思考:
其实这个公式我们知道,但是感觉没niao用~~~~所以就用矩阵快速幂了~~~
ACcode:
#include <stdio.h>
#include <iostream>
#include<algorithm>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <math.h>
#include <vector>
#include <cstring>
#include <stdlib.h>
#include <string.h>
using namespace std;
typedef long long ll;
#define MAXN 1000005
#define INF 0x3f3f3f3f//将近ll类型最大数的一半,而且乘2不会爆ll
const ll mod = 998244353;
#define mem(a, b) memset(a, b, sizeof(a))
struct mat
{
ll m[4][4];
};
mat mul(mat a, mat b)
{
mat res;
for(int i=0; i<4; ++i)
for(int j=0; j<4; ++j)
res.m[i][j] = 0;
for(int i=1; i<=2; ++i)
for(int j=1; j<=2; ++j)
for(int k=1; k<=2; ++k)
res.m[i][k] = (res.m[i][k] + a.m[i][j]*b.m[j][k])%mod;
return res;
}
mat pow(mat a, int b)
{
mat ans;
memset(ans.m, 0, sizeof(ans.m));
ans.m[1][1] = ans.m[2][2] = 1;
while(b)
{
if(b&1)
ans = mul(ans, a);
a = mul(a, a);
b >>= 1;
}
return ans;
}
ll getF(ll s)
{
ll mod, a, b, x0, x1;
char n[105];
int len = 0;
while(s/10)
{
n[len++] = s%10+48;
s/=10;
}
n[len++] = s+48;
reverse(n, n+len);
x0=0, x1=1, a=3, b=2, mod=998244353;
mat ans, ori;
mem(ans.m, 0);
mem(ori.m, 0);
ori.m[1][2] = 1, ori.m[2][1] = b, ori.m[2][2] = a;
ans.m[1][1] = 1, ans.m[2][2] = 1;
for(int i = len-1; i>=0; --i)
{
mat t = pow(ori, n[i]-'0');
ans = mul(ans, t);
ori = pow(ori, 10);
}
return (x0*ans.m[1][1]+x1*ans.m[1][2])%mod;
}
int main()
{
ll q, n;
scanf("%lld %lld", &q, &n);
ll ans = getF(n);
ll xi = n^(ans*ans);
ll sum=ans;
if(q > 50000) q = 50000;
for(int i=2; i<=q; ++i)
{
ans = getF(xi);
sum^=ans;
xi = xi^(ans*ans);
}
cout << sum << '\n';
return 0;
}