已 AC 但有关于数组清空的疑问,求助
查看原帖
已 AC 但有关于数组清空的疑问,求助
613794
jianhe楼主2025/2/5 20:16

link1 交上去没过样例

link2 交上去过了样例

差别仅在于 structaa 数组的清空方式,不知道为什么。

具体见代码:

(仅省略了头)

#include<bits/stdc++.h>// 交上去过不了样例
using namespace std;
#define ll long long
const ll N=1010,mod=1e9+7;
ll n,m,k,ct,heng,shu,pheng,pshu;
string s[N];
struct Mat{
	ll a[4][4]={};
	void init(){a[1][1]=a[2][2]=1;}
	ll* operator[](ll x){return a[x];}
	Mat operator*(Mat b){
		Mat c;
		for(int k=1;k<=2;k++)
			for(int i=1;i<=2;i++)
				for(int j=1;j<=2;j++)
					(c[i][j]+=a[i][k]*b[k][j]%mod)%=mod;
		return c;
	}
}a,ans,t;
ll qp(ll a,ll b,ll ct=1){while(b){if(b&1) ct=ct*a%mod;a=a*a%mod,b>>=1;}return ct;}
void qp(ll b){while(b){if(b&1) ans=ans*a;a=a*a,b>>=1;}}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>m>>k;ans.init(),k--,t[1][1]=t[1][2]=1;
	for(int i=1;i<=n;i++) cin>>s[i],s[i]=" "+s[i];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(s[i][j]=='#') ct++,heng+=(s[i][j-1]=='#'),shu+=(s[i-1][j]=='#');
	for(int i=1;i<=n;i++) pheng+=(s[i][1]=='#'&&s[i][m]=='#');
	for(int j=1;j<=m;j++) pshu+=(s[1][j]=='#'&&s[n][j]=='#');
	if(pheng&&pshu){cout<<1;return 0;}
	if(!pheng&&!pshu){cout<<qp(ct,k);return 0;}
	a[1][1]=ct,a[2][1]=-(pshu?shu:heng),a[2][2]=(pshu?pshu:pheng);
	qp(k);ans=t*ans;
	cout<<(ans[1][1]+mod)%mod;
	return 0;
}

->

#include<bits/stdc++.h>// 交上去过了样例
using namespace std;
#define ll long long
const ll N=1010,mod=1e9+7;
ll n,m,k,ct,heng,shu,pheng,pshu;
string s[N];
struct Mat{
	ll a[4][4];
	Mat(){memset(a,0,sizeof a);}
	void init(){a[1][1]=a[2][2]=1;}
	ll* operator[](ll x){return a[x];}
	Mat operator*(Mat b){
		Mat c;
		for(int k=1;k<=2;k++)
			for(int i=1;i<=2;i++)
				for(int j=1;j<=2;j++)
					(c[i][j]+=a[i][k]*b[k][j]%mod)%=mod;
		return c;
	}
}a,ans,t;
ll qp(ll a,ll b,ll ct=1){while(b){if(b&1) ct=ct*a%mod;a=a*a%mod,b>>=1;}return ct;}
void qp(ll b){while(b){if(b&1) ans=ans*a;a=a*a,b>>=1;}}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>m>>k;ans.init(),k--,t[1][1]=t[1][2]=1;
	for(int i=1;i<=n;i++) cin>>s[i],s[i]=" "+s[i];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(s[i][j]=='#') ct++,heng+=(s[i][j-1]=='#'),shu+=(s[i-1][j]=='#');
	for(int i=1;i<=n;i++) pheng+=(s[i][1]=='#'&&s[i][m]=='#');
	for(int j=1;j<=m;j++) pshu+=(s[1][j]=='#'&&s[n][j]=='#');
	if(pheng&&pshu){cout<<1;return 0;}
	if(!pheng&&!pshu){cout<<qp(ct,k);return 0;}
	a[1][1]=ct,a[2][1]=-(pshu?shu:heng),a[2][2]=(pshu?pshu:pheng);
	qp(k);ans=t*ans;
	cout<<(ans[1][1]+mod)%mod;
	return 0;
}
2025/2/5 20:16
加载中...