社区讨论

求卡常

学术版参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhizifyc
此快照首次捕获于
2025/11/03 18:15
4 个月前
此快照最后确认于
2025/11/03 18:15
4 个月前
查看原帖
矩阵快速幂优化dp,柿子是 fk=fk1+fk3+1f_k=f_{k-1}+f_{k-3}+1,已经把常数项去掉了,时限 1s,目前最慢 1.16s
CPP
#include<bits/stdc++.h>
using namespace std;
int read()
{
	int x=0;
	char c;
	while(!isdigit(c=getchar()));
	while(isdigit(c))
	{
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x;
}
void writing(int x)
{
	if(x>9)writing(x/10);
	putchar(x%10+48);
}
const int mod=1e9+7;
struct jvzhen
{
	long long a[3][3]={{0}};
	jvzhen operator*(jvzhen b)
	{
		jvzhen res;
		for(int i=0;i<3;i++)
		{
			for(int j=0;j<3;j++)
			{
				res.a[i][j]=(res.a[i][j]+(a[i][0]*b.a[0][j])%mod)%mod;
				res.a[i][j]=(res.a[i][j]+(a[i][1]*b.a[1][j])%mod)%mod;
				res.a[i][j]=(res.a[i][j]+(a[i][2]*b.a[2][j])%mod)%mod;
			}
		}
		return res;
	}
}a,p[35];
jvzhen qpow(int x)
{
	jvzhen res;
	int k=0;
	res.a[0][0]=res.a[1][1]=res.a[2][2]=1;
	while(x)
    {
		if(x&1)res=res*p[k];
		k++;
		x>>=1;
	}
	return res;
}
int ans;
signed main()
{
	p[0].a[0][0]=p[0].a[0][2]=p[0].a[1][0]=p[0].a[2][1]=1;
	a.a[0][0]=3;
	a.a[1][0]=a.a[2][0]=2;
	for(int i=1;i<30;i++)
	{
		p[i]=p[i-1]*p[i-1];
	}
	int T=read();
	while(T--)
	{
		int k=read();
		if(k<3)ans^=1;
		else if(k==3)ans^=2;
		else
		{
			jvzhen x=qpow(k-3)*a;
			ans^=(x.a[0][0]-1+mod)%mod;
		}
	}
	writing(ans);
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...