嘘~ 正在从服务器偷取页面 . . .

UOJ60 【UR #5】怎样提高智商 题解


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;
}

文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录