社区讨论
本地测完全正确,真的很离谱
P1939矩阵加速(数列)参与者 4已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @locgf7f6
- 此快照首次捕获于
- 2023/10/30 13:23 2 年前
- 此快照最后确认于
- 2023/11/05 00:56 2 年前
测试点1输入
CPP10
39
20
39
38
56
98
66
86
51
13
输入
CPP1243524
872
1243524
848491
825604416
795935567
743426048
369866299
122106097
60
我的程序在本地跑输出一模一样的答案,但是提交后全WA
CPP#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int P=1e9+7;
int T,n;
namespace mat {
const int L=5,C=5;
ll cge[L][C]={{0,1,0},{0,0,1},{1,0,1}};
ll ans[L][C];
void cpy(ll a[L][C],ll b[L][C]) {
for(ll i=0;i<L;i++)
for(ll j=0;j<C;j++)
a[i][j]=b[i][j];
}
void cal(ll a[L][C],ll b[L][C],ll to[L][C],int l,int c) {
ll t[L][C];
for(int i=0;i<l;i++) {
for(int j=0;j<c;j++) {
ll res=0;
for(int k=0;k<L;k++) res=(res+a[k][i]*b[j][k])%P;
t[j][i]=res;
}
}
cpy(to,t);
}
void pow(int x) {
ll t[L][C]={{1,0,0},{0,1,0},{0,0,1}};
cpy(ans,t);
cpy(t,cge);
while(x) {
if(x&1) cal(t,ans,ans,3,3);
x>>=1;
cal(t,t,t,3,3);
}
}
}
int main() {
ll t[5][5]={{1},{1},{1}};
for(scanf("%d",&T);T;T--) {
scanf("%d",&n);
if(n<=3) printf("1\n");
else {
mat::pow(n-3);
mat::cal(t,mat::ans,mat::ans,1,3);
printf("%lld\n",mat::ans[2][0]%P);
}
}
return 0;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...