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$个元素,交集至少为 ...
随机推荐
- PHP中$_POST和$_GET的用法
post和get是指:页面提交的两种方式get:参数都体现在url上,可以用于翻页,简单查询,get只能接收2M以下的内容,所以有局限性,另外由于内容是可见的,安全性就下降了,post:用于页面表单 ...
- nodejs和ionic小助手
nodejs已经安装完成的情况下,安装ionic小助手 win+r打开cmd. 命令: 1.node -v(查看版本信息) 2.npm -v(查看版本信息) 3.npm install -g cnpm ...
- idea 去除xml文件sql语句背景色
怎么看idea mapper.xml中写sql语句的那种屎黄屎黄背景颜色不好看 去除背景色 把这两项勾选去掉,然后 把这个背景勾选也去掉,最后 把这个勾选也去掉 另一种方式: 也可以使用这种方式 al ...
- RCNN--目标检测
原博文:http://www.cnblogs.com/soulmate1023/p/5530600.html 文章简要介绍RCNN的框架,主要包含: 原图-->候选区域生成-->对每个候选 ...
- Windows下安装Confluence并破解汉化
注:本文来源于<Windows下安装Confluence并破解汉化> 一.事前准备 1:JDK下载并安装:jdk-6u45-windows-i586.exe 2:MySQL JDBC连接驱 ...
- usrp使用
首先打开linux 输入uhd_find_divice gqrx
- 用echarts写的轨迹图demo
轨迹图预览: [下载地址]:https://github.com/zhangzn3/trail-graph.git
- LeetCode(124):二叉树中的最大路径和
Hard! 题目描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不需要经过根节点. 示例 1: 输入: [1, ...
- 【python】多进程与mongo
参考:http://api.mongodb.com/python/current/faq.html#using-pymongo-with-multiprocessing 如果使用了多进程,则必须在子进 ...
- linux 基础知识(三)
抽空把Linux的一些基础的东西再补充一下,安全的东西真的很多都是要自己不断的学习,很多还是今天学习了一点时间过后不用就会忘记.所以学习的东西就是要不断地往复. 有时候感觉有时候快就是慢,慢就是快. ...