HDU4466 Triangle 计数 容斥原理
原文链接https://www.cnblogs.com/zhouzhendong/p/HDU4466.html
题目传送门 - HDU4466
题意
多组数据,每次询问一个数 $n(n\leq 5\times 10^6)$ 。
对于每一次询问,给出一根长度为n的铁丝。将其分成若干段并将每段折成一个三角形,使得三角形都相似。有多少种分法?
其中,注意一下原题中的样例解释:同一个三角形里面的 3 条线段视为无序的,而划分出来的三角形视为有序的,即交换不同三角形的顺序算不同的方案。
答案对 $10^9+7$ 取模。
题解
我们首先考虑求把一根铁丝折成一个三角形的方案总数。
下面这段文字摘自 https://www.cnblogs.com/jianglangcaijin/p/3465526.html
设为 $f_M$ 周长为 $M$ 的三角形的个数。设三角形的三边 $a,b,c$ 满足 $a\leq b\leq c$ ,那么分两种情况:
(1)$b=c$ ,此时 $c$ 的上限为 $\cfrac{M-1}{2}$ ,下限为 $\left\lceil \cfrac M3 \right\rceil=\left\lfloor\cfrac {M+2}{3} \right\rfloor$ ,所以此时的三角形个数为 $\left\lfloor\cfrac{M-1}2\right\rfloor - \left\lfloor\cfrac{M+2}3\right\rfloor+1$ ;
(2)$b\neq c$ ,那么 $b\leq c-1$ ,因为 $a+b>c>c-1$ ,因此一般来说有多少个三角形 $(a,b,c-1)$ 就有多少个三角形 $(a,b,c)$ ,但是此时要减去 $a+b=c$ 的情况。三角形 $(a,b,c-1)$ 的个数就是 $f_{M-1}$ 。此时若 $a+b=c$ ,即 $M-1=a+b+c-1=c+c-1$ ,即 $M=2c$ ,因此 $M$ 必须为偶数。$ a+b=c=\left\lfloor\cfrac M2\right\rfloor$ ,使得 $a+b=\cfrac M2$ 的有序 $(a\leq b)$ 二元组有 $\left\lfloor\cfrac M4\right\rfloor$ 。
然后我们考虑如何处理出满足 $gcd(a,b,c)$ 的方案数。
这个可以用类似素数筛法的方法,利用容斥原理处理。
最后我们在回答询问的时候, $O(\sqrt{n})$ 扫一下 $n$ 的所有因数然后统计一下答案就可以了。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=5e6+5,mod=1e9+7;
int Case=0,n,f[N],Pow[N];
int main(){
Pow[0]=1;
for (int i=1;i<N;i++){
f[i]=(f[i-1]+(i-1)/2-i/3+mod)%mod;
if (i%3==0)
f[i]=(f[i]+1)%mod;
if (i%2==0)
f[i]=(f[i]-i/4+mod)%mod;
Pow[i]=Pow[i-1]*2%mod;
}
for (int i=1;i<N;i++)
for (int j=i*2;j<N;j+=i)
f[j]=(f[j]-f[i]+mod)%mod;
while (~scanf("%d",&n)){
int ans=0;
for (int i=1;i*i<=n;i++)
if (n%i==0){
ans=(1LL*f[i]*Pow[n/i-1]+ans)%mod;
if (i*i!=n)
ans=(1LL*f[n/i]*Pow[i-1]+ans)%mod;
}
printf("Case %d: %d\n",++Case,ans);
}
return 0;
}
HDU4466 Triangle 计数 容斥原理的更多相关文章
- 集训队8月9日(组合计数+容斥原理+Mobius函数)
刷题数:4 今天看了组合计数+容斥原理+Mobius函数,算法竞赛进阶指南169~179页 组合计数 https://www.cnblogs.com/2462478392Lee/p/11328938. ...
- BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]
4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...
- BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...
- bzoj2839 集合计数 组合计数 容斥原理|题解
集合计数 题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是 ...
- 【BZOJ-2839】集合计数 容斥原理 + 线性推逆元 + 排列组合
2839: 集合计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 229 Solved: 120[Submit][Status][Discuss] ...
- LA 3295 (计数 容斥原理) Counting Triangles
如果用容斥原理递推的办法,这道题确实和LA 3720 Highway很像. 看到大神们写的博客,什么乱搞啊,随便统计一下,这真的让小白很为难,于是我决定用比较严格的语言来写这篇题解. 整体思路很简单: ...
- 有标号DAG计数 [容斥原理 子集反演 组合数学 fft]
有标号DAG计数 题目在COGS上 [HZOI 2015]有标号的DAG计数 I [HZOI 2015] 有标号的DAG计数 II [HZOI 2015]有标号的DAG计数 III I 求n个点的DA ...
- BZOJ 2839: 集合计数 [容斥原理 组合]
2839: 集合计数 题意:n个元素的集合,选出若干子集使得交集大小为k,求方案数 先选出k个\(\binom{n}{k}\),剩下选出一些集合交集为空集 考虑容斥 \[ 交集为\emptyset = ...
- bzoj 2839 : 集合计数 容斥原理
因为要在n个里面选k个,所以我们先枚举选的是哪$k$个,方案数为$C_{n}^k$ 确定选哪k个之后就需要算出集合交集正为好这$k$个的方案数,考虑用容斥原理. 我们还剩下$n-k$个元素,交集至少为 ...
随机推荐
- (*(volatile unsigned long *)详解
(*(volatile unsigned long *) 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的.如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实 ...
- SQL语句的行列转换
[一]行转列 1,查询原始的数据 /***这次练习的主题,行转列,列转行***/select * from Scores 2,得到姓名,通过group by select Student as '姓名 ...
- Connection reset by [server_ip] port 22 (hexo d 部署博客出错)
问题 在使用 hexo d 部署博客和使用 Git/Github 进行 git push -u origin master 时遇到了以下问题: git -c diff.mnemonicprefix=f ...
- JS 实现的浏览器系统通知 iNotify.js
注:本分非原创:信息来源 oschina 授权协议:MIT 开发语言:JavaScript 操作系统:跨平台 软件作者:同一种调调 iNotify.js 详细介绍 JS 实现浏览器的 title 闪烁 ...
- Confluence 6 配置服务器基础地址
服务器基础地址(Server Base URL)是用户访问 Confluence 的 URL 地址.这个基础的 URL 地址必须与你在浏览器中访问 Confluence 中的地址. Confluenc ...
- nginx官方模块之http_sub_module
作用 http内容替换 语法 示例 html代码与结果如下:
- java多线程快速入门(十八)
Lock锁是JDK1.5之后推出的并发包里面的关键字(注意捕获异常,释放锁) Lock与synchronized的区别 Lock锁可以人为的释放锁(相当于汽车中的手动挡) synchronized当线 ...
- Cpython支持的进程与线程
一.multiprocessing模块介绍 python中的多线程无法利用CPU资源,在python中大部分情况使用多进程.python中提供了非常好的多进程包multiprocessing. mul ...
- BrupSuite渗透测试笔记(九)
一. Update BurpSuite 1.选择help ,点击check for updates 记可以进入最新版本的下载界面,profession version need pay for mon ...
- ajax----发送异步请求的步骤
1)获取(创建)Ajax对象:获取XMLHttpRequest对象2)创建请求:调用xhr的open方法3)在发送请求之前需要设置回调函数:绑定指定xhr的onreadystatechange事件4) ...