【题解】Counting D-sets(容斥+欧拉定理)
【题解】Counting D-sets(容斥+欧拉定理)
没时间写先咕咕咕。
就是容斥,只是难了一二三四五\(\dots \inf\)点
题目大意:
给定你一个\(n\)维空间,问你这个空间内有多少个点集满足两点间最大的切比雪夫距离为\(d\)。两个点集不同,当且仅当两个点集无法通过平移而想等。
转化1
考虑最后那个限制,平移想等的限制,受这道题的启发【题解】At2370 Piling Up,我们考虑钦定每一维的\(0\)点都有点坐落,这样就钦定了一个基准,问题就转变成了要求每维都有\(0\),且存在某个点的某维坐标为\(d\),且\(d\)是所有数里最大的。
转化2
此类题有一个套路,就是当它钦定最大最小为\(d\)的时候的方案数,可以等于\([0,d]\)的随机分配\(-[0,d-1]\)的随机分配,这样减出来的方案就保证了一定有点在\(d\)空间的边界上,不然一定会被减去。
转化3
所以我们答案就是\(f(d)-f(d-1)\),其中\(f(d)\)表示\(n\)维空间的每维在\([0,d]\)中随意分配坐标的方案数。此时我们发现仍然有问题,因为我们还没有钦定每一维有\(0\)。
考虑我们如何钦定每一维都有零,显然不能一个组合数直接钦定,因为可能一个点的坐标有多个\(0\),这个情况我们考虑不到。但是可以发现每一维本质相同的(意思是可以通过组合数来计算方案),所以可以\(O(n)\)容斥。考虑我们容斥什么,我们容斥钦定每至少i维没有\(0\),最后我们要的是\(0\)维没有\(0\)。
转换4
我们看一个点的坐标,写成这个形式\(p(x_1,x_2,x_3,x_4\dots x_n),x_i\in [0,d],x_i \in N^+\),那么由\(p\)构成的点集的方案是多少呢,我想啊想想不出来就去看题解去了。题解告诉我,这个的方案数是
\]
傻逼了。其实很简单,总共有\((d+1)^n\)个点,枚举每个点放不放即可,注意包括了一个也不放的方案。
那么如何钦定至少\(i\)没有\(0\)呢?很简单,钦定\(x_i\in[1,d]\)就好了。那么这个的方案就是
\]
乘上一个组合数枚举哪些维度没有\(0\)。
所以最终\(f(x)=\)
\]
所以最终答案\(=f(d)-f(d-1)\)
转换5
看答案那个式子,你发现你要到指数上面取膜,你很害怕,因为你好像不知道指数上取膜的运算规则。这就\(naive\)了,模数是\(1e9+7\)是个质数,现在你发现欧拉定理有用了,因为
\]
而质数中,\(\phi(p)=p-1\)。所以你在指数上就直接对\(1e9+6\)取膜就好了。
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int mod=1e9+7;
inline int Pow(int base,const int&p){
register int ret=1;
for(register int t=p;t;t>>=1,base=1ll*base*base%mod)
if(t&1) ret=1ll*ret*base%mod;
return ret;
}
const int mod2=mod-1;
inline int zhiPow(int base,const int&p){
register int ret=1;
for(register int t=p;t;t>>=1,base=1ll*base*base%mod2)
if(t&1) ret=1ll*ret*base%mod2;
return ret;
}
const int maxn=1e3+5;
int jc[maxn],inv[maxn];
int n,d;
inline int c(const int&n,const int&m){
if(n<m)return 0;
return 1ll*jc[n]*inv[m]%mod*1ll*inv[n-m]%mod;
}
inline int F(const int&x){
register int ret=0;
for(register int t=0,delta;t<=n;++t){
delta=1ll*c(n,t)*Pow(2,(1ll*zhiPow(x,t)*zhiPow(x+1,n-t))%mod2)%mod;
if(t&1) delta=mod-delta;
ret=(ret+delta)%mod;
}
return ret;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
//freopen("out.out","w",stdout);
#endif
int T=qr();
jc[0]=inv[0]=1;
for(register int t=1;t<maxn;++t)
jc[t]=1ll*jc[t-1]*t%mod,inv[t]=Pow(jc[t],mod-2);
while(T--){
n=qr(),d=qr();
cout<<((F(d)-F(d-1))%mod+mod)%mod<<endl;
}
return 0;
}
| Status | Accepted |
|---|---|
| Memory | 15257kB |
| Length | 1546 |
| Lang | C++14(gcc 6.3) |
| Submitted | 2019-06-13 17:44:16 |
| Shared | Yes |
| RemoteRunId | 24729181 |
【题解】Counting D-sets(容斥+欧拉定理)的更多相关文章
- bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形 容斥
1914: [Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 272 Sol ...
- CF 449D 题解(状压+容斥)
状压妙啊... 本题的主体思路:状压+容斥原理(或状压+数位dp) 记g[i]表示按位与后结果所有位上至少有i个1的方案数 那么根据容斥原理,ans=g[0]-g[1]+g[2]-g[3]+g[4]. ...
- CF990G GCD Counting 点分治+容斥+暴力
只想出来 $O(nlogn\times 160)$ 的复杂度,没想到还能过~ Code: #include <cstdio> #include <vector> #includ ...
- How Many Sets I(容斥定理)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3556 How Many Sets I Time Limit: 2 ...
- kth min_max容斥
题解: 普通的$min-max$容斥是用来求最后出现元素的期望之类的 $kth min-max$容斥进一步解决倒数第k个出现的元素的期望 给出公式: $kthmax(S)=\sum\limits_{T ...
- 【CF900D】Unusual Sequences 容斥(莫比乌斯反演)
[CF900D]Unusual Sequences 题意:定义正整数序列$a_1,a_2...a_n$是合法的,当且仅当$gcd(a_1,a_2...a_n)=x$且$a_1+a_2+...+a_n= ...
- 【BZOJ2839】集合计数(容斥,动态规划)
[BZOJ2839]集合计数(容斥,动态规划) 题面 BZOJ 权限题 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使 ...
- 【BZOJ4596】黑暗前的幻想乡(矩阵树定理,容斥)
[BZOJ4596]黑暗前的幻想乡(矩阵树定理,容斥) 题面 BZOJ 有\(n\)个点,要求连出一棵生成树, 指定了一些边可以染成某种颜色,一共\(n-1\)种颜色, 求所有颜色都出现过的生成树方案 ...
- loj2542 「PKUWC2018」随机游走 MinMax 容斥+树上高斯消元+状压 DP
题目传送门 https://loj.ac/problem/2542 题解 肯定一眼 MinMax 容斥吧. 然后问题就转化为,给定一个集合 \(S\),问期望情况下多少步可以走到 \(S\) 中的点. ...
随机推荐
- dml语句就是你常写的sql语句,增删改查
dml语句就是你常写的sql语句,增删改查
- TensorFlow笔记三:从Minist数据集出发 两种经典训练方法
Minist数据集:MNIST_data 包含四个数据文件 一.方法一:经典方法 tf.matmul(X,w)+b import tensorflow as tf import numpy as np ...
- 微信小程序 - 答题进度条
关于进度条的话,我是使用官方原生的progress的. 关于进度progress接受保留2位小数(从后端获取到平均值,再item循环出来) js wxml
- 世纪怎么换算成具体的年份?eg:19世纪60年代=19??年?
http://zhidao.baidu.com/question/339742625.html&__bd_tkn__=6ab5183c226b84031b08b849ecac35b396039 ...
- .net发布网站步骤
本文章分为三个部分: web网站发布.IIS6 安装方法.ASP.NET v4.0 安装方法 一.web网站发布 1.打开 Visual Studio 2013 编译环境 2.在其解决方案上右击弹出重 ...
- python selenium2 - 鼠标键盘操作
文件路径:Python27\Lib\site-packages\selenium\webdriver\common\action_chains.py action_chains[鼠标键盘动作] 方法说 ...
- linux 静态库使用经验
在编写程序的过程中,对于一些接口往往抽象成lib库的形式,甚至有些程序只有一个主程序,其他接口的调用都是库的形式存在.较多的使用库会比较利于程序的维护,因为我们的程序都可以被其他的人使用,但是往往库的 ...
- CentOS开启FTP及配置用户
vsftpd作为FTP服务器,在Linux系统中是非常常用的.下面我们介绍如何在centos系统上安装vsftp. 什么是vsftpd vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序 ...
- Bootstrp--一个导航面板切换的实用例子
<!--导航区开始--> <ul class="nav nav-tabs nav-stacked" role="tablist"> &l ...
- Urho3D 在Win10下编辑器崩溃的解决方案
本解决方案来自于 https://github.com/urho3d/Urho3D/issues/2417 描述 在Win10中通过CMake启用URHO_ANGELSCRIPT选项的前提下生成Urh ...