2024.5.5
校赛
J.矩阵的k次幂
难点1.for循环的设置
乘的结果为第一行*第一列的和,
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int o=1;o<=n;o++){
ans[i][j] = a[i][o]*a[o][j];
}
}
}
难点2.答案ans[i][j]的更新
b[i][j]=(ans[i][j] + mod)%mod;
memset(ans,0,sizeof(ans));
难点3. k为0等特殊情况
如果k=0,则为E
ac代码
//注意在每次更新后,ans[n][n]=0,所以输出应为b[i][j]
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
long long a[110][110],b[110][110],ans[110][110];
int main()
{
memset(ans,0,sizeof(ans));
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
b[i][j]=a[i][j];
}
}
while(k>1){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int o=1;o<=n;o++){
ans[i][j]+=(a[i][o]*b[o][j])%mod;
}
ans[i][j]=(mod+ans[i][j])%mod;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
b[i][j]=(mod + ans[i][j])%mod;
}
}
memset(ans,0,sizeof(ans));
k--;
}
if(k==0){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) cout<<"1 ";
else cout<<"0 ";
}
cout<<endl;
}
}
else{
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<b[i][j]<<" ";
}
cout<<endl;
}
}
return 0;
}
2024.5.6
F.最优方案
思路:联想到 log2(n)
7=pow(2,3)-1
15=pow(2,4)-1
难点:超时问题
输入输出用scanf printf时通过,但用cin cout时超时了
ac代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
scanf("%d",&t);
while(t--){
ll cnt=0,n;
ll k=1;
scanf("%ld",&n);
if(n==1) cnt=1;
else{
while(k<=n){
k*=2;
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}