https://scut.online/p/113

终于想懂了这个容斥,

华工4月23号校赛,
考虑总的所有情况,设1---n里面含有质数的个数为all,需要固定m个质数。那么有

totSum = C(all, m) * (n - m)!,就是在all个质数里面,任意选m个出来固定,剩下的全排。

但是算多了,因为还有一些质数(不在那m个之内)也会被固定,

而且,考虑样例

5 1,

1 2 3 4 5


这个时候,先考虑任选m个出来固定,题目就是任选1个出来固定。剩下的全排

比如固定了2,剩下的全排,会产生,只固定了2,固定了2、3,固定了2、5,固定了2、3、5

比如固定了3,剩下的全排,会产生,只固定了3,固定了2、3,固定了3、5,固定了2、3、5

比如固定了5,剩下的全排,会产生,只固定了5,固定了2、5,固定了3、5,固定了2、3、5

那么只有第一列相加的才是正确答案。后面的要减去。

减去固定了两个的时候,

这个时候前面一个已经固定了,再枚举一个来固定,就是固定2个。所以固定(3, 2)和(2, 3)是不同的方案。

固定了(2, 3)时,会有,只固定2、3和固定了2、3、5

固定了(3, 2)时,会有,只固定3、2和固定了3、2、5

.....

等等。

减去这些后,会发现结果是ans - 3 * (固定了2、3、5),加回来就是了。

就是一个容斥,以后容斥要实打实写出来,毕竟不是大神。

哭~~~~

比赛没想到。刚才也想了很久,光想是不行的。要模拟。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset> bool check(int val) {
int en = (int)sqrt(val);
for (int i = ; i <= en; ++i) {
if (val % i == ) return false;
}
return true;
}
const int MOD = 1e9 + ;
LL fac[];
LL quick_pow(LL a, LL b, LL MOD) {
LL base = a % MOD;
LL ans = ;
while (b) {
if (b & ) {
ans = ans * base % MOD;
}
base = base * base % MOD; b >>= ;
}
return ans;
} LL C(LL n, LL m, LL MOD) {
if (n < m) return ;
if (n == m) return % MOD;
LL ans1 = ;
LL ans2 = ;
LL mx = max(n - m, m);
LL mi = n - mx;
for (int i = ; i <= mi; ++i) {
ans1 = ans1 * (mx + i) %MOD;
ans2 = ans2 * i % MOD;
}
return (ans1 * quick_pow(ans2, MOD - , MOD) % MOD);
}
int n, m;
void work() {
fac[] = ;
for (int i = ; i <= ; ++i) {
fac[i] = fac[i - ] * i % MOD;
}
int all = ;
for (int i = ; i <= n; ++i) {
all += check(i);
}
LL ans = C(all, m, MOD) * fac[n - m] % MOD;
// cout << ans << endl;
for (int i = ; i <= all - m; ++i) {
if (i & ) {
ans = (ans + MOD - C(all, m, MOD) * C(all - m, i, MOD) % MOD * fac[n - (m + i)] % MOD) % MOD;
} else ans = (ans + C(all, m, MOD) * C(all - m, i, MOD) % MOD * fac[n - (m + i)] % MOD) % MOD;
}
cout << ans % MOD << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
#endif
scanf("%d%d", &n, &m);
work();
return ;
}

D、Homework of PE 容斥原理的更多相关文章

  1. PE Checksum Algorithm的较简实现

    这篇BLOG是我很早以前写的,因为现在搬移到CNBLOGS了,经过整理后重新发出来. 工作之前的几年一直都在搞计算机安全/病毒相关的东西(纯学习,不作恶),其中PE文件格式是必须知识.有些PE文件,比 ...

  2. 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构

    2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下,可执行文件的存储格式的WLF格式.它们都是COFF格式文件的变种,都是从COFF格式的文件演化而来的. ...

  3. hdu4059 The Boss on Mars(差分+容斥原理)

    题意: 求小于n (1 ≤ n ≤ 10^8)的数中,与n互质的数的四次方和. 知识点: 差分: 一阶差分: 设  则    为一阶差分. 二阶差分: n阶差分:     且可推出    性质: 1. ...

  4. hdu2848 Visible Trees (容斥原理)

    题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...

  5. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  6. BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3028  Solved: 1460[Submit][Sta ...

  7. bzoj 4320: ShangHai2006 Homework

    4320: ShangHai2006 Homework Time Limit: 10 Sec Memory Limit: 128 MB Description 1:在人物集合 S 中加入一个新的程序员 ...

  8. 简单PE类代码

    三个文件分别是类定义文件pefile.h;类实现文件pefile.cpp;类调用文件petype.cpp. #ifndef PE_FILE_H #define PE_FILE_H #include & ...

  9. 获取pe文件的文件类型

    工程文件petype.cpp通过调用pefile类中的函数获取文件类型. 文件类型的判断通过5个监测点完成. 监测点1:dos头的e_magic 监测点2:nt头的Signature 监测点3:文件头 ...

随机推荐

  1. mac下配置java运行环境

    1. oracle官网下载java se jdk地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-38 ...

  2. 【坑坑坑坑坑】fwrite没有把数据写到文件中???

    原文:https://blog.csdn.net/kuaidfkuai/article/details/45918025 <unix环境高级编程>中介绍标准IO: 标准IO流操作读写普通文 ...

  3. ef 多个模块,通过程序集映射entity,指定对应的repository

    在Entity Framework repository下加两个方法: public virtual T GetByEntityName(object id, string EntityTypeNam ...

  4. linux进程学习-进程描述符的存储

    当进程被新建时,内核会给进程分配一个8K的空间作为进程的内核堆栈.同时我们知道task_struct结构体也会被创建,但有意思的是,内核不会给task_struct单独分别空间,而是直接将其扔到8k的 ...

  5. 理解I/O Completion Port(完成端口)

    欢迎阅读此篇IOCP教程.我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼.OK,但我不能保证你明白IOCP的一切,但我会尽我 ...

  6. python使用uuid生成唯一id或str

    介绍: UUID是128位的全局唯一标识符,通常由32字节的字符串表示. 使用: import uuid print uuid.uuid1() 14bfe806-f1c7-11e6-83b5-0680 ...

  7. 树——平衡二叉树插入和查找的JAVA实现

    package com.tomsnail.data.tree; /** * AVL二叉平衡树 * @author tomsnail * @date 2015年3月30日 下午4:35:50 */ pu ...

  8. navicat 关于orcale新建表空间,用户和权限分配

    图文教程,直观, 上面连接数据库 下面创建表空间 建表空间的设置 表空间名的设置 新建用户 填写用户名,选择默认表空间 成员属性德设置,这里因为是自己用,所以选择最大权限,其他的权限这是需要专业的了 ...

  9. 把myeclipse中的web项目导入eclipse中不能编程web项目的解决办法

    title: 把myeclipse中的web项目导入eclipse中不能编程web项目的解决办法 tags: grammar_cjkRuby: true --- 右键单击项目,properties-- ...

  10. KMP匹配 (1)

    ---恢复内容开始--- 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串" ...