原题链接:Problem - 1622D - Codeforces

题目大意:给你一串01串,告诉你长度n和一个数k,这个串中所有1的数量为k的子串,可以把这段子串重新排序。问你最后这个串能有多少种。

思路:看第一个案例就知道会有重复的情况,但是区间重复不好算,又因为n为5000, n * n能跑,所以暴力枚举i, j(j > i,因为区间为一个长度的时候它跟谁换呢,换不了)作为第一个改变的地方和最后一个改变的地方。如果i ~ j区间1的数量<= k,就可以进行这样的操作。因为i和j下标的地方一定会改变,设i到j区间中1d个数是cnt,那么如果左右端点是0,就要用到1,所以左右端点i j有几个0就把cnt减几。然后除了左右端点,中间有i - j - 1个数,要把更新了的cnt个1分配给i - j - 1个地方,所以就是C(j - i - 1, cnt)。还有一点要注意的地方,如果一个地方都不修改,那么就是原串,所以一开始ans为1。

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int, int> PII;
const double pi = acos(-1.0);
#define rep(i, n) for (int i = 1; i <= (n); ++i)
#define rrep(i, n) for (int i = n; i >= (1); --i)
typedef long long ll;
#define sqar(x) ((x)*(x))const ll M = 998244353;
const int N = 5010;
char s[N];
int a[N], pre[N];
ll fac[N], invfac[N];inline ll qpow(ll a, ll n, ll p)// 快速幂
{ll ans = 1;while (n){if (n & 1)ans = ans % p * a % p;a = a % p * a % p;n >>= 1;}return ans;
}inline ll inv(ll a, ll p)
{return qpow(a, p - 2, p);
}void init() //注意要在主函数中init()!!!
{fac[0] = 1;for (int i = 1; i < N; ++i) fac[i] = (fac[i - 1] * i) % M;invfac[N - 1] = inv(fac[N - 1], M);for (int i = N - 2; i >= 0; --i) invfac[i] = (invfac[i + 1] * (i + 1)) % M;
}ll C(int n, int m)
{if (n < m || m < 0) return 0;return fac[n] * invfac[m] % M * invfac[n - m] % M;
}int main()
{init();int n, k;scanf("%d %d", &n, &k);scanf("%s", s + 1);rep(i, n) a[i] = s[i] - '0';rep(i, n) pre[i] = pre[i - 1] + a[i];ll ans = 1;if(pre[n] < k){puts("1"); return 0;}rep(i, n)for(int j = i + 1; j <= n; j++){if(pre[j] - pre[i - 1] > k) break;int cnt = pre[j] - pre[i - 1];cnt -= (a[i] == 0) + (a[j] == 0);ans = (ans + C(j - i - 1, cnt)) % M;}printf("%lld", ans);return 0;
}

D. Shuffle(cf)暴力枚举 + 组合数学相关推荐

  1. POJ 3174 暴力枚举

    思路: 暴力枚举三个点 判一判 搞定 (x1*y1=x2*y2) x1.y1.x2.y2为他们两两的差 //By SiriusRen #include <cstdio> using nam ...

  2. codeforces数学1600day6[CodeForces - 1029C多区间交+枚举,CodeForces 992C[数学公式推导],CodeForces 992B[质因数分解+暴力枚举]]

    A - Maximal Intersection CodeForces - 1029C 题目大意:就是给你n个区间,这n个区间有公共的区间长度为x,现在叫你从这n个区间中删掉一个使得x最大化. 解题思 ...

  3. 最大字段和 冲出暴力枚举

    这篇解题报告是对我最近一些题的总结,里面的代码都是我解题,优化,再优化的过程的记录,记录了自己对算法的完善与优化思路,还有对编程哲学的理解:do it,do it well. 很感谢孙老师您,让自己可 ...

  4. hdu 4587 TWO NODES 暴力枚举+tarjan

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4587 题意是拿掉两个点 求最多可以把整个图分成几个联通块 注意到有一个模板是可以通过找割点来快速求出 ...

  5. 一道暴力枚举题Win32版本示例

    来看一个问题:该问题的解法是 暴力枚举:这大概是ACM方面的:名称叫火柴棒等式: 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数( ...

  6. C. Divisibility by Eight【暴力枚举】

    暴力枚举即可.枚举1位这种情况,枚举2位这种情况,枚举3位这种情况. 3位满足足以,其他的4位,5位...都包含1000必定满足. #include<bits/stdc++.h> usin ...

  7. YBTOJ:灯光控制(贪心)(公倍数)(暴力枚举)

    文章目录 题目描述 解析 代码 题目描述 解析 没有想出来 首先可以确定开关要么开一次,要么不动,其他都和这俩是等价的 一开始最先想到的就是贪心的方法,每个开关遍历,如果按下会使答案变好就按下. 但是 ...

  8. array专题2---理解暴力枚举与动态规划

    746 Min Cost Climbing Stairs 一直以后对暴力枚举(又称:深度优先搜索)和动态规划不太理解,不能明白个中区别,更别说贪心.今天做这道题目的时候有点心得. 思路一:看到题目,直 ...

  9. 【POJ - 2965】The Pilots Brothers' refrigerator(暴力枚举,思维)

    题干: The game "The Pilots Brothers: following the stripy elephant" has a quest where a play ...

最新文章

  1. stm32 IO口模式的寄存器配置
  2. python简易图形-python简单图形界面GUI入门——easygui【转】
  3. jQuery validate 如何清除remote验证的缓存 (在select验证时这个bug尤为明显)
  4. qunee for html5 api,Qunee for HTML5
  5. 【收藏】从 0 到 1 学习 elasticsearch ,这一篇就够了!
  6. Springboot注册Listener
  7. iec60870-5-104通讯协议编程_三菱FX编程口通讯协议1——协议解读
  8. [学习总结]6、Android异步消息处理机制完全解析,带你从源码的角度彻底理解
  9. php连接postgresql数据库
  10. 一组优秀的 for .NET Winform UI控件——DotNetMagic最新版本2.3,推荐使用
  11. “echo ”和“echo ”的区别
  12. cxf整合spring发布webservices服务端
  13. java编码解码工具类
  14. 转:信息部是管理部门or服务部门?这些CIO在群里“吵” 起来了
  15. 申论(基础题)之扫清阅读障碍和提取障碍
  16. java 调用cmd_java打开本地应用程序(调用cmd)---Runtime用法详解
  17. 嵌入式之linux入门篇
  18. 专业计算机术语中英文对照(一)
  19. hp6960无法连接计算机,支持多种打印方式 惠普OfficeJet Pro 6960评测
  20. 用计算机读心书,423世界读书日,线上线下共读华章

热门文章

  1. ExtJS (3.3的使用)
  2. CSS中的text-overflow属性详解 (控制文字在一行显示,超出部分加省略号)
  3. 深度学习-BP神经网络
  4. GDT(全局描述表)
  5. 简单说一说手机中常用的芯片-OVP芯片
  6. Lora SX1278芯片 模块引脚的功能介绍
  7. 在Linux下安装hping3
  8. 全选、删除、撤回、剪切、复制、粘贴、永久性删除、新建文件夹、启动任务管理器、退出的快捷键
  9. 如何在win10的windows Defender中添加信任文件,使其免遭误删除的厄运
  10. 差分隐私 python_差分隐私