zoukankan      html  css  js  c++  java
  • CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题

    A Aqours

    题解:
    https://www.cnblogs.com/qieqiemin/p/11251645.html

    D:吉良吉影的奇妙计划 (暴力打表)

    题目描述

    吉良吉影是一个平凡的上班族,他决定在休假的闲暇时光里制定接下来2n2n天的指甲修剪计划。

    首先,吉良吉影会在纸上写下2n2n个字(左、右各nn个),表示他每天是修剪左手的指甲还是右手的指甲。但是吉良吉影是一个称职的上班族,不会浪费这么多时间在修剪指甲上,于是他决定将一些位置改成空(即那天不剪指甲)。吉良吉影从头扫视整个计划,如果出现连续两天,剪的是不同的手,那么他就会将这两天改成空,并从头开始重复这个过程。直到不存在连续两天剪不同手的指甲为止。比如初始的计划为左左右左左右右右,那么在第一次修改后变成左空空左左右右右,在第二次修改后变成左空空左空空右右。由于吉良吉影的指甲生长的非常快,所以他不能容忍出现连续4天或以上的空,如果在最终的计划中出现了连续4个的空,那么他认为这样的计划不合法并炸掉计划。

    现在吉良吉影想知道,他可能造出多少种合法的计划?两个计划被认为不同,当且仅当存在任意一天的选择不同。

    输入描述

    第一行包含一个整数n(1 le n le 20)n(1≤n≤20)。

    输出描述

    输出仅一行,表示合法计划的数量,对998244353998244353取模。

    样例输入 1

    3
    样例输出 1

    6

    思路:
    2*n=40,二进制暴力枚举显然是不可接受的,又因为对于每一个n,答案是固定的,那么我们直接dfs深搜,本地跑出1~20的所有答案。然后直接输出答案

    要加剪枝优化才可以本地很快的跑出结果,但是不要交dfs的程序,会TLE,必须本地打表交。

    下面贴上暴搜的程序。

    细节见代码:

    #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
    ",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), '', 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 == '
    ');
        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:穗乃果的考试 (公式)

    题面:
    题目描述

    为了能在新学期获得 LoveLive! 的出场资格,mu'sμ

    s 的成员们必须所有考试都要及格才能继续活动。但高坂穗乃果的数学不太好,需要大家的帮助才能及格。

    有一天,穗乃果碰到了一个这样的数学题,她不太会做,但是如果说自己不会做很可能会被希给予严厉的惩罚,所以她在 mu'sμ

    s 粉丝群中找到了学霸的你,希望能请你帮帮她。题目是这样的:

    给定一个 n imes mn×m 的 01 矩阵,记 f_if
    i

    为恰有 ii 个 1 的子矩阵的个数,求:sum_{i=0}^{nm}i cdot f_i∑
    i=0
    nm

    i⋅f
    i

    输出答案对 998244353 取模的结果。

    输入描述

    第一行两个正整数 n,m(1le n,m le 2000)n,m(1≤n,m≤2000),表示矩阵的大小。

    接下来 nn 行,每行mm个为00或为11的字符。第ii行的第jj个字符代表矩阵的第ii行的第jj个元素的值。

    输出描述

    仅一行一个非负整数表示答案对 998244353 取模的结果。

    样例输入 1

    3 3
    010
    111
    010
    样例输出 1

    64

    思路:
    在第i行第j列的1在i(n-i+1)j(m-j+1) 个子矩阵中,所以他就会对这么多个矩阵做贡献。nm扫一遍累加即可

    细节见代码:

    #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
    ",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), '', 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 == '
    ');
    	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';
    		}
    	}
    }
     
     
    
    
    
    本博客为本人原创,如需转载,请必须声明博客的源地址。 本人博客地址为:www.cnblogs.com/qieqiemin/ 希望所写的文章对您有帮助。
  • 相关阅读:
    Java 实现 蓝桥杯 生兔子问题
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 LeetCode 33 搜索旋转排序数组
    Java实现 LeetCode 33 搜索旋转排序数组
    Java实现 LeetCode 33 搜索旋转排序数组
    深入探究VC —— 资源编译器rc.exe(3)
    深入探究VC —— 编译器cl.exe(2)
    深入探究VC —— 编译器cl.exe(1)
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/11241034.html
Copyright © 2011-2022 走看看