简要题意
谜题集中有 \(n\) 个谜题,第 \(i\) 个谜题形如:
\(i.\) 编号小于 \(i\) 的题目中你选择了几个 \(h_i\)?
A. \(a_i\)
B. \(b_i\)
C. \(c_i\)
D. \(d_i\)
给定 \(n\),你需要构造一个谜题集,使得不同的正确答案数量尽可能多。输出正确答案数量(对 \(998244353\) 取模)和方案。若有多组解,输出任意一组解即可。
\(1 \leq n \leq 10^5\)
思路
构造。
每一道谜题中所有选项都可以选是不可能的。(但是第一题四个选项可以都选)
于是我们退而求其次,考虑编号 \(\geq2\) 的可以选 \(3\) 项。假设都可以选 \(B,C,D\),那么 \(h_i=A\) 即可。为了保证都可以选,\(b_i=c_i=d_i=a_i=0\)。
于是,我们惊奇的发现构造完了!
正确答案数量就是 \(4\cdot3^{n-1}\)。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
int fastpow(int a,int b,int mod){
if(b==1)return a%mod;
if(b==0)return 1%mod;
int ret=1;
if(b&1){
ret*=b;
ret%=mod;
b--;
}
int k=fastpow(a,b>>1,mod);
return ret*k*k;
}
int n;
signed main(){
cin>>n;
cout<<4*fastpow(3,n-1,mod)<<'\n';
for(int i=1;i<=n;i++){
cout<<"A 0 0 0 0\n";
}
return 0;
}