考拉 解题报告

其中 \(n,m \leq 100\)。
初见毫无思路,于是打了暴力。枚举了一定范围内的 \((n,m)\),发现答案矩阵长这样:
\(\begin{bmatrix}
1 & 0 & 1 & 0 & 1 & ... \\
0 & 2 & 0 & 8 & 0 & ... \\
1 & 0 & 16 & 0 & 256 & ... \\
0 & 8 & 0 & 512 & 0 & ...\\
1 & 0 & 256 & 0 & 65536 & ...\\
... & ... & ...& ... & ... & ...
\end{bmatrix}\)
发现矩阵中的非零数都是 \(2\) 的若干次,且数值非零的位置的横纵下标的奇偶性一定相同。经过猜想,我们发现 \((i,j)\) 位置的值为 \(2^{i+j-2}\)。
启示:无头绪时打表
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define For(i,s,t) for(int i=s;i<=t;i++)
#define Down(i,s,t) for(int i=s;i>=t;i--)
using namespace std;
typedef long long ll;
inline int min(int x,int y){return x<y?x:y;}
inline int max(int x,int y){return x>y?x:y;}
inline int read(){
register int x=0;
char c=getchar();
while(c<'0' || '9'<c) c=getchar();
while('0'<=c && c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar();
return x;
}
const int N=1e3+10,mod=1e4;
int T,n,m,a[N][N];
struct Big{
int first,a[N];
Big(int _x=0){
memset(a,0,sizeof(a));
first=0,a[first]=_x;
}
Big operator *(const Big x) const{
Big ans;
ans.first=first+x.first;
For(i,0,first)
For(j,0,x.first)
ans.a[i+j]+=a[i]*x.a[j],ans.a[i+j+1]+=ans.a[i+j]/mod,ans.a[i+j]%=mod;
For(i,0,ans.first)
ans.a[i+1]+=ans.a[i]/mod,ans.a[i]%=mod;
if(ans.a[ans.first+1]) ans.first++;
return ans;
}
void print(){
printf("%d",a[first]);
Down(i,first-1,0){
if(a[i]<1000) putchar('0');
if(a[i]<100) putchar('0');
if(a[i]<10) putchar('0');
printf("%d",a[i]);
}
}
}ans,x;
void quick_pow(int y){
ans=Big(1),x=Big(2);
while(y){
if(y&1)
ans=ans*x;
x=x*x;
y>>=1;
}
}
void slove(){
n=read(),m=read();
if(n%2!=m%2){printf("0\n");return;}
if(n>m) swap(n,m);
int pow=0,nw=n+m-3;
For(i,2,n)
pow+=nw,nw-=2;
quick_pow(pow);
ans.print();
putchar('\n');
}
int main()
{
freopen("koala.in","r",stdin);
freopen("koala.out","w",stdout);
T=read();
while(T--) slove();
return 0;
}

浙公网安备 33010602011771号