UOJ60 【UR #5】怎样提高智商 题解
题目链接:#60. 【UR #5】怎样提高智商
题意:
共有 \(n\) 道选择题,编号为 \(1\) 到 \(n\)。第 \(i\) 道题形如:(\(h_i\) 为 “A” 或 “B” 或 “C” 或 “D”,\(a_i, b_i, c_i, d_i\)都是整数)
\(i\). 编号小于 \(i\) 的题目中你一共选了几个 \(h_i\)?
A. \(a_i\) 个 B. \(b_i\) 个 C. \(c_i\) 个 D. \(d_i\) 个
求出所有 \(n\) 道选择题的试卷中,正确答案最多的试卷。
例子:
编号小于 \(1\) 的题目中你一共选了几个 B?
A. \(0\) 个 ,B. \(7\) 个 ,C. \(1\) 个 ,D. \(4\) 个
编号小于 \(2\) 的题目中你一共选了几个 A?
A. \(3\) 个 ,B. \(2\) 个 ,C. \(1\) 个 ,D. \(4\) 个
编号小于 \(3\) 的题目中你一共选了几个 D?
A. \(0\) 个 ,B. \(2\) 个 ,C. \(1\) 个 ,D. \(0\) 个
共有两种正确答案。一种可能的正确答案为:第一题选A,第二题选C,第三题选D。
输入格式:
共一行,包含一个正整数 \(n\),表示试卷中选择题的个数。
输出格式:
第一行一个整数,表示正确答案最多的试卷的正确答案数。你只用输出答案对 \(998244353\)(\(7 \times 17 \times 2^{23} + 1\),一个质数)取模后的值。
接下来 \(n\) 行输出一种正确答案最多的试卷。如果有多种你可以输出任意一种。
这 \(n\) 行中的第 \(i\) 行包含 \(h_i, a_i, b_i, c_i, d_i\),表示第 \(i\) 道选择题。
\(h_i\) 为 “A” 或 “B” 或 “C” 或 “D”,\(a_i, b_i, c_i, d_i\) 都是整数且 \(0 \leq a_i, b_i, c_i, d_i \leq 10^9\)。
数据范围:
\(n \le 10^5\)
纯构造题,没什么规律可循。
先默认第一问 \(h_1=\mathtt{A}\) ,ABCD都 \(0\) 。
接着随便选BCD中的一个
不难发现发现此时如果 \(h_2=\mathtt{A}\) ,则和第一问一模一样
然后第一问可以设置 \(4\) 种情况,接下来的每一问都有 \(3\) 种情况
总方案数 \(4 \times 3^{n-1}\) 。构造一种么随便搞搞就好了。
更详细的可以参考这篇博客
代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cstdarg>
#include <cmath>
#include <iomanip>
#include <random>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N ((int)())
const int mod = 998244353;
int qpow(int a,int b)
{
int ans=1,base=a%mod;
for(; b; b >>= 1)
{
if(b & 1) ans = ans * base % mod;
base = base * base % mod;
}
return ans;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
// freopen("check.in","r",stdin);
// freopen("check.out","w",stdout);
int n; cin >> n;
cout << 4*qpow(3,n-1)%mod << '\n';
for(int i=1; i<=n; i++) cout << "A 0 0 0 0\n";
return 0;
}