link1 交上去没过样例
link2 交上去过了样例
差别仅在于 struct
内 a 数组的清空方式,不知道为什么。
具体见代码:
(仅省略了头)
#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;
}