原文链接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 计数 容斥原理的更多相关文章

  1. 集训队8月9日(组合计数+容斥原理+Mobius函数)

    刷题数:4 今天看了组合计数+容斥原理+Mobius函数,算法竞赛进阶指南169~179页 组合计数 https://www.cnblogs.com/2462478392Lee/p/11328938. ...

  2. BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]

    4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...

  3. 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是第二类斯特林 ...

  4. bzoj2839 集合计数 组合计数 容斥原理|题解

    集合计数 题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是 ...

  5. 【BZOJ-2839】集合计数 容斥原理 + 线性推逆元 + 排列组合

    2839: 集合计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 229  Solved: 120[Submit][Status][Discuss] ...

  6. LA 3295 (计数 容斥原理) Counting Triangles

    如果用容斥原理递推的办法,这道题确实和LA 3720 Highway很像. 看到大神们写的博客,什么乱搞啊,随便统计一下,这真的让小白很为难,于是我决定用比较严格的语言来写这篇题解. 整体思路很简单: ...

  7. 有标号DAG计数 [容斥原理 子集反演 组合数学 fft]

    有标号DAG计数 题目在COGS上 [HZOI 2015]有标号的DAG计数 I [HZOI 2015] 有标号的DAG计数 II [HZOI 2015]有标号的DAG计数 III I 求n个点的DA ...

  8. BZOJ 2839: 集合计数 [容斥原理 组合]

    2839: 集合计数 题意:n个元素的集合,选出若干子集使得交集大小为k,求方案数 先选出k个\(\binom{n}{k}\),剩下选出一些集合交集为空集 考虑容斥 \[ 交集为\emptyset = ...

  9. bzoj 2839 : 集合计数 容斥原理

    因为要在n个里面选k个,所以我们先枚举选的是哪$k$个,方案数为$C_{n}^k$ 确定选哪k个之后就需要算出集合交集正为好这$k$个的方案数,考虑用容斥原理. 我们还剩下$n-k$个元素,交集至少为 ...

随机推荐

  1. java中package指什么

    为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间,类似C#的 namespace的作用,防止名字相同的类产生冲突. Java中的一个package(包)就是一个类库单元,包内包含有一组 ...

  2. Vuex与axios介绍

    Vuex集中式状态管理里架构 axios (Ajax) Vuex集中式状态管理架构 -简单介绍: vuex是一个专门为Vue.js设计的集中式状态管理架构. 我们把它理解为在data中需要共享给其他组 ...

  3. CSS 三角形与圆形

    1. 概述 1.1 说明 通过边框(border)的宽度与边框圆角(border-radius)来设置所需的三角形与圆形. 1.2 边框 宽高都为0时,边框设置的不同结果也不同,如下: 1.四个边框都 ...

  4. 16)django-ajax使用

    通过ajax可以悄悄的把数据传输给服务器,实现页面无刷新. 一:ajax使用语法 1)普通方式 ajax使用语法: $.ajax({ url:"/host", //提交到那里 ty ...

  5. 帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)

    作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞 ...

  6. 从 Confluence 5.3 及其早期版本中恢复空间

    如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话.你可以使用临时的 Confluence 空间安装,然后将 ...

  7. django的查看sql语句setting设置

    LOGGING = {     'version': 1,     'disable_existing_loggers': False,     'handlers': {         'cons ...

  8. C++ Primer 笔记——IO类

    1.C++语言并未定义任何输入输出语句,取而代之,包含了一个全面的标准库来提供IO机制. 由上图能够知道,I/O操作的基类是ios_base,各个类的用途例如以下: <iostream> ...

  9. bootstrap-table 刷新页面数据

    bom.bootstrapTable('load',msg['object']);//这一步 务必要添加. if(msg['code']==1){ bom.find('tbody').css('dis ...

  10. SVN_2008R2 搭建流程与规范

    Svn服务在win2008 搭建 1:svn服务的原理与架构 1.Svn服务可以理解为加强版的ftp文件服务器, svn采用HTTP协议的方式进行文件传输 2.服务端安装好后,普通用户也需要下载一个c ...