今天比赛做的一个题目,不过今天终于感受到了复旦题目有多坑了。

题目的意思是给你一段长为n个单位长度的直线,你可以选择任意连续单位长度的线段组成三角形,可以组成任意你可以组成任意多个三角形,且要求其中所有的三角形相似。现在要你求出,总共有多少种三角形的情况。 详情见题目。

题目的意思明白了以后就可以开始思考具体怎么解题了。

比赛开始的时候我也很费解,到底怎么求出所有的排列组合的情况。

一开始我是这样考虑的,要使得最终的每一个三角形都相似,那么其中所有的三角形必须有一个不小于3的公约数,但是对于三角形的边长怎么不重复地搞出来还是没有办法。

其实是这样来搞的。我们用一个函数f(i)来表示周长为i的独特的三角形的数目有多少。我这里所谓的“独特”,其实是其不会与任何一个周长小于i的三角形相似。但是后来仔细一想就知道是gcd(a,b,c)=1,也就是说三角形的三边互质。同时f[i]表示的只是a不大于b,b不大于c的种类数量。

对于某一个i,其独特的种类数可以用类似容斥原理的方法求得。

什么意思呢?

另某一个中间变量tot=[sigama]f(x),(x为A的所有的约数),那么f(A)=count(x)-tot。这里count(x)表示周长为x的三角形的总数。

这样就可以得到所有的独特数了。

题目剩下的就比较简单了,枚举独特的三角形的时候对于后面的每一个独立的独特单元,它都有两种组合情况,要么与前面的组合,要么不组合,这样就可以快速幂解决了。

 #include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 5000500
#define M 1000000007
#define ll long long
using namespace std; ll f[maxn]; ll count(ll x)
{
ll tot=;
for (int i=; i<=x/; i++)
{
int tep=x-i;
if (tep/>=max(i,(tep-i)/+))
{
tot=(tot+tep/-max(i,(tep-i)/+)+);
if (tot>=M) tot-=M;
}
}
return tot;
} ll get(ll x)
{
if (f[x]!=) return f[x];
ll tot=;
for (int i=; i<=x/; i++)
if (x%i==)
{
tot=(tot+get(i));
if (tot>=M) tot-=M;
}
f[x]=count(x)-tot;
if (f[x]<) f[x]+=M;
return f[x];
} ll power(ll x,ll y)
{
ll tot=;
while (y)
{
if (y&) tot=(tot*x)%M;
x=(x*x)%M;
y>>=;
}
return tot;
} int main()
{
ll n,ans,tep,cas=;
while (scanf("%I64d",&n)!=EOF)
{
ans=;
for (int i=; i*i<=n; i++)
{
if (n%i==)
{
tep=get(i);
tep=(tep*power(,n/i-))%M;
ans+=tep;
if (ans>=M) ans-=M; if (i*i!=n)
{
tep=get(n/i);
tep=(tep*power(,i-))%M;
ans+=tep;
if (ans>=M) ans-=M;
}
}
} printf("Case %I64d: %I64d\n",++cas,ans);
}
return ;
}

HDU4466_Triangle的更多相关文章

随机推荐

  1. pwd命令的实现

    pwd 命令描述 Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd ...

  2. 第六周课上测试-3-ch02补充作业

    实验要求: 编写一个程序 "week0603学号.c",运行下面代码: short int v = -学号后四位 unsigned short uv = (unsigned sho ...

  3. 20155322 2017-2018-1 《信息安全系统设计》第五周 MyBash实现

    #20155322 2017-2018-1<信息安全系统设计>第五周 MyBash实现 [博客目录] 实现要求 相关知识 bash fork exec wait 相关问题 fork返回两次 ...

  4. 课下测试CH01补交

    课下测试CH01补交 ( 单选题 | 1 分) Amdahl定律说明,我们对系统的某个部分做出重大改进,可以显著获得一个系统的加速比. A . 正确 B . 错误 正确答案: B 你的答案: 未作答 ...

  5. 20155328 2016-2017-2 《Java程序设计》 第一周学习总结

    20155328 2016-2017-2 <Java程序设计> 第一周学习总结 教材学习内容总结 本周学习目标是浏览<Java学习笔记>中的十八章,其中第一章和第二章认真学习, ...

  6. 2762 helloparty·开车

    2762 helloparty·开车 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold   题目描述 Description hellokitty的一个朋友要来他家,但是 ...

  7. Ceph学习之路(二)之Ceph的工作原理及流程

    一.RADOS的对象寻址 Ceph 存储集群从 Ceph 客户端接收数据——不管是来自 Ceph 块设备. Ceph 对象存储. Ceph 文件系统.还是基于 librados 的自定义实现——并存储 ...

  8. centos下JDK安装及环境变量配置

    由于centos安装自带openjdk,需要将其卸载后安装自己的jdk 卸载centos自带jdk 1.查找java :rpm -qa | grep java 2.卸载时提示权限不够,进入root目录 ...

  9. CF刷题-Codeforces Round #481-D. Almost Arithmetic Progression

    题目链接:https://codeforces.com/contest/978/problem/D 题解: 题目的大意就是:这组序列能否组成等差数列?一旦构成等差数列,等差数列的公差必定确定,而且,对 ...

  10. Codeforces Round #500 (Div. 2) D - Chemical table

    首先我们如果满足三缺一,那么必有同行和同列的点 如果两行有同列的数,我们可以设想,他们最后会全部填充成为两者啥都有的情况 显然这个是个并查集 现在我们有了很多集合,每个集合自己可以进行三缺一操作,但是 ...