1. 程式人生 > >洛谷P5159 WD與矩陣

洛谷P5159 WD與矩陣

輸入格式 題解 long 描述 def pac ref code namespace

題目背景

WD整日沈浸在矩陣中,無法自拔……

題目描述

WD特別喜歡矩陣,尤其是\(01\)矩陣。

一天,CX給了WD一個巨大的\(n\)\(m\)列的\(01\)矩陣,WD發現這個矩陣每行、每列的異或值都是\(0\).

CX隨後就問道:“WD,你知道有多少\(01\)矩陣每行每列異或值都是\(0\)嗎!?”WD當然不會這個問題,於是他來請教你。

由於答案可能很大,輸出結果模\(998244353\)的值即可。

輸入輸出格式

輸入格式:

第一行一個數\(T\),表示數據組數。

接下來\(T\)行每行兩個數\(n,m\),分別表示詢問的行數和列數。

輸出格式:

\(T\)行,每行一個數,表示答案\(mod\)

\(998244353\)的結果。

輸入輸出樣例

輸入樣例#1:

2
2 2
2 2018

輸出樣例#1:

2
851481696

說明

\(subtask1(11pts):~1\le T\le 10,~1\le n,m\le 4\)

\(subtask1(43pts):~1\le T\le 5,~1\le n\le 5,~1\le m\le 1,000\)

\(subtask1(46pts):~1\le T\le 100,000,~1\le n,m\le 10^9\)

思路:

題意是讓你求滿足n行m列且每行每列異或值都是0的矩陣個數,因為是異或,所以只可能有兩個值,\(0\)\(1\),那麽每行可能的取值就是\(2^n\)

,然後最後值是0的情況是就是\(2^{n-1}\),然後擴展到列上,那麽就是\((2^{n-1})^{m-1}\),然後自己再打打表就發現,顯然這個式子是正確的,然後用快速冪求解,計算的過程中記得取模。

自己整理的題解

下面是我簡潔的代碼:

#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
#define mod 998244353
using namespace std;
ll n,m;
int t;
inline ll fpow(ll a, ll b) {
  if(!b) return 1;
  ll ans=1;
  for(;b;b>>=1,a=(a*a)%mod)
    if(b&1) ans=(ans*a)%mod;
  return ans;
}
int main() {
  scanf("%d",&t);
  while(t--) {
    scanf("%lld%lld",&n,&m);
    printf("%lld\n",fpow(fpow(2,n-1),m-1));
  }
  return 0;
}

洛谷P5159 WD與矩陣