CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题
A Aqours
題解:
https://www.cnblogs.com/qieqiemin/p/11251645.html
D:吉良吉影的奇妙計(jì)劃 (暴力打表)
題目描述
吉良吉影是一個平凡的上班族,他決定在休假的閑暇時光里制定接下來2n2n天的指甲修剪計(jì)劃。
首先,吉良吉影會在紙上寫下2n2n個字(左、右各nn個),表示他每天是修剪左手的指甲還是右手的指甲。但是吉良吉影是一個稱職的上班族,不會浪費(fèi)這么多時間在修剪指甲上,于是他決定將一些位置改成空(即那天不剪指甲)。吉良吉影從頭掃視整個計(jì)劃,如果出現(xiàn)連續(xù)兩天,剪的是不同的手,那么他就會將這兩天改成空,并從頭開始重復(fù)這個過程。直到不存在連續(xù)兩天剪不同手的指甲為止。比如初始的計(jì)劃為左左右左左右右右,那么在第一次修改后變成左空空左左右右右,在第二次修改后變成左空空左空空右右。由于吉良吉影的指甲生長的非常快,所以他不能容忍出現(xiàn)連續(xù)4天或以上的空,如果在最終的計(jì)劃中出現(xiàn)了連續(xù)4個的空,那么他認(rèn)為這樣的計(jì)劃不合法并炸掉計(jì)劃。
現(xiàn)在吉良吉影想知道,他可能造出多少種合法的計(jì)劃?兩個計(jì)劃被認(rèn)為不同,當(dāng)且僅當(dāng)存在任意一天的選擇不同。
輸入描述
第一行包含一個整數(shù)n(1 \le n \le 20)n(1≤n≤20)。
輸出描述
輸出僅一行,表示合法計(jì)劃的數(shù)量,對998244353998244353取模。
樣例輸入 1
3
樣例輸出 1
6
思路:
2*n=40,二進(jìn)制暴力枚舉顯然是不可接受的,又因?yàn)閷τ诿恳粋€n,答案是固定的,那么我們直接dfs深搜,本地跑出1~20的所有答案。然后直接輸出答案
要加剪枝優(yōu)化才可以本地很快的跑出結(jié)果,但是不要交dfs的程序,會TLE,必須本地打表交。
下面貼上暴搜的程序。
細(xì)節(jié)見代碼:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <vector> #include <iomanip> #define ALL(x) (x).begin(), (x).end() #define rt return #define dll(x) scanf("%I64d",&x) #define xll(x) printf("%I64d\n",x) #define sz(a) int(a.size()) #define all(a) a.begin(), a.end() #define rep(i,x,n) for(int i=x;i<n;i++) #define repd(i,x,n) for(int i=x;i<=n;i++) #define pii pair<int,int> #define pll pair<long long ,long long> #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define MS0(X) memset((X), 0, sizeof((X))) #define MSC0(X) memset((X), '\0', sizeof((X))) #define pb push_back #define mp make_pair #define fi first #define se second #define eps 1e-6 #define gg(x) getInt(&x) #define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl using namespace std; typedef long long ll; ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;} ll lcm(ll a, ll b) {return a / gcd(a, b) * b;} ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;} inline void getInt(int* p); const int maxn = 1000010; const int inf = 0x3f3f3f3f; /*** TEMPLATE CODE * * STARTS HERE ***/ll ans=0ll; const ll mod=998244353ll; int a[maxn]; int n; void dfs(int dep,int cnt0,int cnt1) {if(dep==2*n+1){ // rep(i,1,dep) // { // cout<<a[i]<<" "; // } // cout<<endl;ans++;ans%=mod;}else{if(cnt1){if(a[dep-1]!=0){a[dep]=1;dfs(dep+1,cnt0,cnt1-1);}}if(cnt0){if(a[dep-1]!=1){a[dep]=0;dfs(dep+1,cnt0-1,cnt1);}}if(cnt1&&cnt0&&(dep+1<=2*n)&&a[dep-1]!=-1){a[dep]=-1;a[dep+1]=-1;dfs(dep+2,cnt0-1,cnt1-1);}} } int main() {//freopen("D:\\code\\text\\input.txt","r",stdin);//freopen("D:\\code\\text\\output.txt","w",stdout);a[0]=3;repd(i,1,20){ans=0ll;n=i;dfs(1,i,i);cout<<ans<<",";}return 0; }inline void getInt(int* p) {char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}}else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}} }G:穗乃果的考試 (公式)
題面:
題目描述
為了能在新學(xué)期獲得 LoveLive! 的出場資格,\mu'sμ
′
s 的成員們必須所有考試都要及格才能繼續(xù)活動。但高坂穗乃果的數(shù)學(xué)不太好,需要大家的幫助才能及格。
有一天,穗乃果碰到了一個這樣的數(shù)學(xué)題,她不太會做,但是如果說自己不會做很可能會被希給予嚴(yán)厲的懲罰,所以她在 \mu'sμ
′
s 粉絲群中找到了學(xué)霸的你,希望能請你幫幫她。題目是這樣的:
給定一個 n\times mn×m 的 01 矩陣,記 f_if
i
?
為恰有 ii 個 1 的子矩陣的個數(shù),求:\sum_{i=0}^{nm}i \cdot f_i∑
i=0
nm
?
i?f
i
?
輸出答案對 998244353 取模的結(jié)果。
輸入描述
第一行兩個正整數(shù) n,m(1\le n,m \le 2000)n,m(1≤n,m≤2000),表示矩陣的大小。
接下來 nn 行,每行mm個為00或?yàn)?1的字符。第ii行的第jj個字符代表矩陣的第ii行的第jj個元素的值。
輸出描述
僅一行一個非負(fù)整數(shù)表示答案對 998244353 取模的結(jié)果。
樣例輸入 1
3 3
010
111
010
樣例輸出 1
64
思路:
在第i行第j列的1在i(n-i+1)j(m-j+1) 個子矩陣中,所以他就會對這么多個矩陣做貢獻(xiàn)。nm掃一遍累加即可
細(xì)節(jié)見代碼:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <vector> #include <iomanip> #define ALL(x) (x).begin(), (x).end() #define rt return #define dll(x) scanf("%I64d",&x) #define xll(x) printf("%I64d\n",x) #define sz(a) int(a.size()) #define all(a) a.begin(), a.end() #define rep(i,x,n) for(int i=x;i<n;i++) #define repd(i,x,n) for(int i=x;i<=n;i++) #define pii pair<int,int> #define pll pair<long long ,long long> #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define MS0(X) memset((X), 0, sizeof((X))) #define MSC0(X) memset((X), '\0', sizeof((X))) #define pb push_back #define mp make_pair #define fi first #define se second #define eps 1e-6 #define gg(x) getInt(&x) #define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl using namespace std; typedef long long ll; ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;} ll lcm(ll a, ll b) {return a / gcd(a, b) * b;} ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;} inline void getInt(int* p); const int maxn = 1000010; const int inf = 0x3f3f3f3f; /*** TEMPLATE CODE * * STARTS HERE ***/ char a[2005][2005]; int n,m; const ll mod=998244353ll; int main() {//freopen("D:\\code\\text\\input.txt","r",stdin);//freopen("D:\\code\\text\\output.txt","w",stdout);gbtb;cin>>n>>m;repd(i,1,n){repd(j,1,m){cin>>a[i][j];}}ll ans=0ll;repd(i,1,n){repd(j,1,m){if(a[i][j]=='1'){ans=(ans+(1ll*i*(n-i+1)*j*(m-j+1))%mod)%mod;// cout<<i<<" "<<j<<" "<<i*(n-i+1)*j*(m-j+1)<<endl;}}}cout<<ans<<endl;return 0; }inline void getInt(int* p) {char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}}else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}} }轉(zhuǎn)載于:https://www.cnblogs.com/qieqiemin/p/11241034.html
總結(jié)
以上是生活随笔為你收集整理的CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 技术规划应该写成什么样?
- 下一篇: 简评知乎的优点与不足