CodeForces - 1425D Danger of Mad Snakes(容斥+组合数学)
题目链接:点击查看
题目大意:初始时有一个二维平面, 平面上给出 n 条蛇,现在可以选择 m 条不同的蛇进行捕杀,当选择了某条蛇,其所在的坐标可以覆盖到的半径为 r 的范围内的蛇都会被捕杀,更确切的说,选择了位置 ( x , y ) 的蛇,那么 ( x - r , y - r ) ~ ( x + r , y + r ) 这个矩形内的蛇都会被捕杀,每条蛇都有自己的价值,每次捕杀的价值是(所有被捕杀的蛇的价值和)的平方,问所有方案的价值和是多少
题目分析:比较巧妙的一道容斥题目,首先看到平方应该顺着去思考,而不是我行我素的去思考每条蛇单独的贡献
利用完全平方公式将平方和拆开:
如果增加变量的个数,不难看出实际上也是两层 for 循环可以表达出来的一个求和公式
所以我们不妨去考虑每一对蛇 ( i , j ) 的贡献,直接求交集是比较困难的,但是正难则反,可以思考求交集的补集,那么利用容斥推一下公式:
- 同时包含蛇 i 和蛇 j 的方案 = 总方案 - ( 不同时包含蛇 i 和蛇 j 的方案 )
- 不同时包含蛇 i 和蛇 j 的方案 = 不包含蛇 i 的方案 + 不包含蛇 j 的方案 - 不包含蛇 i 也不包含蛇 j 的方案
- 不包含蛇 i 也不包含蛇 j 的方案 = 不包括 { ( 蛇 i 的捕杀矩形 ) 与 ( 蛇 j 的捕杀矩形 ) 的并集 } 的方案 = { 全集 - ( 蛇 i 的捕杀矩形 ) 与 ( 蛇 j 的捕杀矩形 ) 的并集 } 的方案
- ( 蛇 i 的捕杀矩形 ) 与 ( 蛇 j 的捕杀矩形 ) 的并集 = 蛇 i 后的捕杀矩形 +蛇 j 后的捕杀矩形 - ( 蛇 i 的捕杀矩形 与 蛇 j 的捕杀矩形 的面积交集 )
不难发现一步步递推是可以间接求出我们所想要求出的答案的,关于最后的那个矩形面积,用二维前缀和求一下就好了,其余的用组合数学求解一下即可
补充一下关于矩形的交集,实质上是两条线段的交集,这个在纸上稍微画一下就明白了
代码:
//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e3+100;const int mod=1e9+7;int x[N],y[N],maze[N][N];LL fac[N],inv[N],b[N];LL q_pow(LL a,LL b)
{LL ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;
}LL C(int n,int m)
{if(n<m)return 0;return fac[n]*inv[m]%mod*inv[n-m]%mod;
}int cal(int x1,int y1,int x2,int y2)
{if(x1>x2||y1>y2)return 0;x1=max(x1,1),y1=max(y1,1);x2=min(x2,1000),y2=min(y2,1000);return maze[x2][y2]-maze[x2][y1-1]-maze[x1-1][y2]+maze[x1-1][y1-1];
}void init()
{fac[0]=1;for(int i=1;i<N;i++)fac[i]=fac[i-1]*i%mod;inv[N-1]=q_pow(fac[N-1],mod-2);for(int i=N-2;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
}int main()
{
#ifndef ONLINE_JUDGE
// freopen("data.ans.txt","r",stdin);
// freopen("data.out.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);init();int n,m,r;scanf("%d%d%d",&n,&m,&r);for(int i=1;i<=n;i++){scanf("%d%d%lld",x+i,y+i,b+i);maze[x[i]][y[i]]++;}for(int i=1;i<=1000;i++)for(int j=1;j<=1000;j++)maze[i][j]+=maze[i-1][j]+maze[i][j-1]-maze[i-1][j-1];LL ans=0;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){LL res=b[i]*b[j]%mod;LL cnt=C(n,m);LL noi=C(n-cal(x[i]-r,y[i]-r,x[i]+r,y[i]+r),m);LL noj=C(n-cal(x[j]-r,y[j]-r,x[j]+r,y[j]+r),m);LL noij=C(n-cal(x[i]-r,y[i]-r,x[i]+r,y[i]+r)-cal(x[j]-r,y[j]-r,x[j]+r,y[j]+r)+cal(max(x[i]-r,x[j]-r),max(y[i]-r,y[j]-r),min(x[i]+r,x[j]+r),min(y[i]+r,y[j]+r)),m);cnt=((cnt-noi-noj+noij)%mod+mod)%mod;res=cnt*res%mod;ans=(ans+res)%mod;}printf("%lld\n",ans);return 0;
}
CodeForces - 1425D Danger of Mad Snakes(容斥+组合数学)相关推荐
- CF1425D Danger of Mad Snakes题解
CF1425D Danger of Mad Snakes 题意:有一个1000∗10001000*10001000∗1000的地图,上面有一些蛇,第i条蛇在(xi,yi)(x_i,y_i)(xi,y ...
- codeforces B. Friends and Presents(二分+容斥)
题意:从1....v这些数中找到c1个数不能被x整除,c2个数不能被y整除! 并且这c1个数和这c2个数没有相同的!给定c1, c2, x, y, 求最小的v的值! 思路: 二分+容斥,二分找到v的值 ...
- Codeforces 1342E Placing Rooks(容斥+组合数学)
题目链接:E. Placing Rooks 题意:给定一个N*棋盘,要求摆放n个rooks(国际象棋里能横竖走的那啥),使得每个格子都能被rooks攻击到,并且正好有k对rooks能相互攻击到,求有多 ...
- CodeForces 997C-Sky Full of Stars〖容斥定理+组合计数〗
网页链接:传送门 C. Sky Full of Stars time limit per test : 4 seconds memory limit per test : 256 megabytes ...
- 51nod1667-概率好题【容斥,组合数学】
正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1667 题目大意 两个人. 第一个人有k1k_1k1个集合,第iii个包 ...
- 【洛谷 P4921】—情侣?给我烧了!(加强版)(容斥+组合数学)
传送门 接着之前的思路继续推 瓶颈在于预处理f(n)f(n)f(n) 考虑化一下 f(n)=∑j=0n(−1)j1j!2j1(n−j)!2(2n−2j)!=1n!2∑j=0n(−1)jj!2j(nj) ...
- 牛客 - 小朋友你是否有很多问号(容斥+组合数学)
题目链接:点击查看 题目大意:先抛出公质数的定义,若数 num 与 m 个数都互质,则称 num 为 m 个数的 m元公质数 ,现在给出 n 个数和 m ,需要求出任意 m 个数的所有 m 元公质数( ...
- Codeforces 100548F - Color (组合数+容斥)
题目链接:http://codeforces.com/gym/100548/attachments 有n个物品 m种颜色,要求你只用k种颜色,且相邻物品的颜色不能相同,问你有多少种方案. 从m种颜色选 ...
- CodeForces - 1486F Pairs of Paths(树上计数+容斥)
题目链接:点击查看 题目大意:给出一棵 nnn 个点的树,再给出 mmm 条路径,现在问有多少个路径对 (x,y)(x,y)(x,y),满足第 xxx 条路径和第 yyy 条路径有且仅有一个交点 题目 ...
最新文章
- VVOL、VASA — 为什么如此重要
- 关于Python类属性与实例属性的讨论
- Linux备份压缩命令
- c语言数据结构学习心得——线性表
- Packet Tracer 5.0 建构 CCNA 实验攻略——路由器实现 Vlan 间通信
- 简单聊聊Python协程
- php中文件读写总结,PHP中文件读写操作
- Lifetime of Objects
- NTV Media Server G3流媒体服务器搭建经验
- ElasticSearch学习(一):Linux环境准备
- pip和requests模块的安装
- c语言程序设计第三版朱立华主编课后答案,C语言程序设计习题解析与实验指导...
- 全国OA系统下载 (转)
- Kali Linux-MSF远控局域网手机
- 计算机二级九月试题office,9月计算机二级office题库及答案
- Android 9 禁用按住电源键+音量加键进入工厂测试(recovery模式)功能
- 用python输出圣诞树_教你怎样用Python画了一棵圣诞树,赶紧来学习
- 977.有序数组的平方
- 柔性机械臂的振动测量和控制研究进展综述
- 数学推理相关的几个名词及LaTeX用法