1. 程式人生 > 其它 >UOJ60.【UR #5】怎樣提高智商

UOJ60.【UR #5】怎樣提高智商

簡要題意

謎題集中有 \(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;
}