题意:你需要构造n个四项选择题。格式为:问在前i个问题中选了几个hi字母?
输出有最多正确答案的构造方案。
标程:
1 #include<cstdio> 2 using namespace std; 3 typedef long long ll; 4 const int mod=998244353; 5 int ksm(int x,int y) 6 { 7 int res=1; 8 while (y) {if (y&1) res=(ll)res*x%mod; x=(ll)x*x%mod; y>>=1;} 9 return res; 10 } 11 int main() 12 { 13 int n; 14 scanf("%d",&n); 15 printf("%d\n",(ll)ksm(3,n-1)*4%mod); 16 for (int i=1;i<n;i++) puts("A 1 0 0 0"); 17 puts("A 0 0 0 0"); 18 return 0; 19 }
题解:构造
大力猜结论
考虑怎样让答案之间的影响最小,不然到后面难以构造。
不管什么字母,第一局的答案一定是0。所以我们可以给第一局设一个错误答案,该选项一定不会被选。
第二局就询问这个选项被选了几次,答案也一定是0,于是再在同一位置设错误答案。以此类推。
最后一行不用顾忌下一行,四个都是0即可。
正确答案数有3^(n-1)*4.