2019山东省赛B - Flipping Game ZOJ - 4114 题解

题意:

  初始有n个灯泡,灯泡状态是0和1,。现在有k轮操作,每次改变且仅改变m个的灯的状态,给定n盏灯的初始状态的最终状态,求有多少种解决改变灯的方案满足可以满足题目条件。

思路:

  开始写的时候以为是组合计数和容斥原理什么鬼的,后来发现n,m,k的值都比较小,觉得应该是三维dp了,当然是瞎想,最后看题解还是一个二维dp可以解决的问题,只不过是三重循环。给队友lrr说了一下题解的状态定义,他也较快就写出来了。其实对于灯的状态,每次改变一次之后,现在的问题和之前的问题形式一样,只是k值和目标灯的状态不同的个数变了。

  状态如下定义dp【i】【j】表示操作到第 i 轮,与目标的灯的状态不同的个数为 j 的操作方案数量。初始化dp[k][0]=1,dp[k][others]=0。倒退dp的状态转移,对于第k-1次,他的方案数是第k次全部的dp数组(即dp【k】)中转移而来的。对于dp[k][j],与目标状态j的不同,n-j个相同,设改变j个中的x个,改变n-j个中的y个(这里要求x+y=m&& j-x+y=kk)(kk为dp【k】中与目标状态不同的个数为kk)。这样可以解出x和y,当x和y满足为整数并且x<=j&&y<=n-j 即为合理的转移方案。这样dp转移就不存在什么重复计数的问题,因为都是一种存在的状态变化而来的,计算出到达每种状态的方案数量,最后的答案就是dp[0][ans],ans为初始与目标状态不同的灯泡数量。

  接下来思考为什么要这样设计状态,可能是由于灯泡的特殊性,具体也不太清楚。

代码:

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;

typedef long long ll;

const int INF=0x3f3f3f3f;
const int MAX_N=1e5+5;
const int M=998244353;

int n,k,m;
ll dp[105][105];
ll fac[105],inv_fac[105];

ll mod_pow(ll x,ll n){
    ll res=1;
    while(n>0){
        if(n&1)res=res*x%M;
        x=x*x%M;
        n>>=1;
    }
    return res;
}

void init(){
    fac[0]=1;
    for(int i=1;i<105;i++){
        fac[i]=fac[i-1]*i%M;
    }
    inv_fac[104]=mod_pow(fac[104],M-2);
    for(int i=103;i>=0;i--){
        inv_fac[i]=inv_fac[i+1]*(i+1)%M;
    }
}

ll C(int n,int m){
    return fac[n]*inv_fac[n-m]%M*inv_fac[m]%M;
}

void  fun(int ans){
    memset(dp,0,sizeof(dp));
    for(int i=0;i<105;i++)dp[k][i]=0;
    dp[k][0]=1;//only the same is ok
    for(int i=k-1;i>=0;i--){
        for(int j=0;j<=n;j++){
                for(int kk=0;kk<=n;kk++){
                        int x=m-kk+j;
                        int y=kk+m-j;
                        if(x%2==0&&y%2==0&&x/2<=j&&x/2>=0&&y/2<=n-j&&y/2>=0)
                      dp[i][j]=(dp[i][j]+dp[i+1][kk]*C(j,x/2)%M*C(n-j,y/2)%M)%M;
                }

        }
    }
     printf("%lld\n",dp[0][ans]);
}

int main()
{
    init();
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&n,&k,&m);
        string s1,s2;
        cin>>s1>>s2;
        int ans=0;
        for(int i=0;i<s1.length();i++){
            if(s1[i]!=s2[i])ans++;
        }
        fun(ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/gzr2018/p/10882754.html

时间: 2024-10-07 18:17:37

2019山东省赛B - Flipping Game ZOJ - 4114 题解的相关文章

2019山东省赛K - Happy Equation ZOJ - 4123 题解

题意: 一个数论题,要求满足如下等式的x有多少个. 思路: 当时比赛是,队伍看到这个题,也没有做太多的思考,就是无从下手,几乎放弃.但是看到学校另外两支队伍都过了这个题,感觉自己还是好菜. 打表可以发现,当a为奇数的时候答案为1.当a为偶数的时候,x一定也是偶数,这个还是比较明显的. 对左边进行推导,因为a为偶数,设a=2*t,所以a^x=2^x*t^x,所以当x大于p时,这个求余之后一定为0.由于p很小,可以直接暴力求解,所以对于右边直接考虑x^a求余之后为0的x的情况.由于x为偶数.我们再次

2019山东省赛反省

此次比赛,我很荣幸得此机会跟着学长学姐去打铁.第一次接触这种比赛,确实感到新奇,同时也有不安,因为平时没好好做题,知之甚少,基础确实是超级不稳的.好在学长说让我们开阔一下眼界,尽力就行.比赛做出几个题我就不说了,但是补题的时候真的发现我们真的很菜,简单的题我们竟然可以耗时那么久.....emmm,,以后可得努力了 A - Calandar On a planet far away from Earth, one year is composed of 12 months, and each mo

山东省赛题 NEU OJ 1444 线段树双标记

http://acm.neu.edu.cn/hustoj/problem.php?id=1444 OJ问题论坛发帖http://t.cn/zjBp4jd FAQ http://t.cn/zjHKbmN Linux问题看http://t.cn/aWnP1n 1444: Devour Magic 时间限制: 1 Sec  内存限制: 256 MB 提交: 129  解决: 21 [提交][状态][讨论版] 题目描述 In Warcraft III, Destroyer is a large flyi

第五届山东省赛总结

这次比赛在HITWH,10号我们早早的坐车来到了威海,然后随便逛了逛,吃了饭,就是热身赛. 热身赛题目比较坑爹,尤其是A题,要求区间素数个数,给的数据是10^7,我写了一个却WA了.后来得知有10^9的情况,感觉一下成了神题,我想了好久也没思路,结束后得知大于10^7的数全部当成10^7做,太坑.但这样都有人能AC,真是膜拜.B题是要交一个随机数,RP比较好,2A.C据说是概率DP,我不会也没仔细看. 之后是开幕式,完了以后我一个人回了宾馆,跟山大威海的同学吃了一顿,随后回去看了看电视就睡了.

hdu1212 Big Number &amp;第六届山东省赛Single Round Math (同余定理,大数取模)

题目链接:Big Number 题目大意:每次输入两个数,第一个是高精度,第二个数小于100000:求 a mod b 根据同余定理: (a+b)% c = (a%c+ b%c)%c (a*b)%c =  ( a%c* b%c)%c 所以 对于大数,例如 :123 可以这样分解 123 =  (1*10+2)*10 + 3: 123 % c =   (  (  (  1%c *  10%c)%c + 2%c) %c  * 10%c) + 3 %c  ) %c; 因此,我们用字符串处理这个数,通过

2019模拟赛09场解题报告

目录 2019模拟赛09场解题报告 目录la~~ 题一:瞬间移动 题二:食物订购 题三:马蹄印 题四:景观美化 2019模拟赛09场解题报告 标签(空格分隔): 解题报告 Forever_chen 2019.8.20 目录la~~ 题一:瞬间移动 [题面] 有一天,暮光闪闪突然对如何将一个整数序列a1,a2,...,an排序为一个不下降序列起了兴趣.身为一只年轻独角兽的她,只能进行一种叫做"单元转换"(unit shift)的操作.换句话说,她可以将序列的最后一个元素移动到它的起始位置

HDU6706 CCPC 2019网络赛 huntian oy 推式子+杜教筛

CCPC 2019 网络赛 HDU 6706 huntian oy 标签 奇奇怪怪的数论结论 杜教筛 前言 我的csdn和博客园是同步的,欢迎来访danzh-博客园~ 简明题意 给定n,a,b,求: \[\sum_{i=1}^n\sum_{j=1}^igcd(i^a-j^a,i^b-j^b)[gcd(i,j)=1]\%(10^9+7)\] 思路 首先有一个结论: \[gcd(i^a-j^a,i^b-j^b)=i^{gcd(a,b)}-j^{gcd(a,b)}\] 上面的结论对于i,j互质是成立的

2019年山东省赛记录

随随便便写的东西... 5月10号开开心心坐上高铁去济南啦,第一次坐济南青岛的高铁,体验还是很舒服的,以后回家就坐这个啦.到了之后有点聊城的感觉,有点想家.打车去了济南大学,吐槽一句,订得这宾馆真垃圾.所以下周去南京的时候订的连锁酒店.晚上去济南大学遛弯儿,舒适. 11号,上午去报道,下午开幕式+热身赛.开幕式的时候山大被讽刺得好惨,今年的冠军??会是哪个学校呢,哈哈哈??.热身赛卡在了C题,二分正确性没有证明,不过 ycz 最后一分钟A了,优秀.除了防AK题都A了. 12号正式赛开始啦.一开始

第6届山东省赛总结帖

又是一年省赛时.在这次省赛之前,窝们队刚经历了换队友风波,这次终于有了一个稳定,积极,一起为共同的目标而努力的队伍.在以很快的速度换完队友之后,距省赛还有不到两个月了.于是每周四在CF的gym上自加一场练习赛,然后加上周末的周赛,每周双赛,跟新队友ly之间的配合也越来越好.我总算把剩下的不算很难的图论知识点都刷完了,+cai也刷了一大堆数据结构,ly也刷了很多数学.(于是计算几何仍然没人刷..). 这次能拿到第4名金牌的成绩,窝们自己在赛前根本没想到会拿到这个成绩.之前的目标就是金牌,根据我们了