题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4466

题目意思:

一根长为N的木棒,长度分成若干个三角形,使得任意两个三角形都相似。对应顺序三角形全部全等的为同一种分法,求总共有多少种分法。

解题思路:

数学题。

先考虑分成一个三角形的情况。

不妨设a<=b<=c;

1、当b=c时,a至少为1,所以c<=(n-1)/2

而a<=b 所以n-2*c<=c =>c>=n/3; 故共有(n-1)/2-(n/3)+(n/3?0:1)种。

2、当b<c时,肯定有b<=c-1

此时若a+b>c 则a+b>c-1

如果a,b,c能构成三角形,则a,b,c-1也一定能够构成三角形。

反过来,如果a,b,c-1能够构成三角形,也即a+b>c-1 当a+b!=c时,一定能使a,b,c构成三角形。故可以通过dp[n-1]递推过来,然后减去a+b=c+1的情况。

此时n=2*c+1,c=(n-1)/2  只有当n为奇数的时候才有可能,而a+b=(n-(n-1)/2),a<=b 所以这种情况共有 (n-(n-1)/2)/2种,化简得(n+1)/4

在考虑有多个三角形的情况。

假设N=a*b 则把b作为一个基本三角形,a个1,作为a个部分,中间有a-1个隔板,每个隔板可选可不选,一共有2^(a-1)种情况。

当所有的隔板都不选的话,就是一个大三角形,所以此时要把,刚才求得的一个三角形中三边不互质的数量减掉。而每个约数,对应的该约数能拆分成一个互质三角形的种数的不互质的三角形,乘以倍数就是大的不互质的三角形。

详见代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define M 1000000007
#define N (5000000+10) /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/
int dp[N],bin[N]; //dp[i]表示一个三角形的情况,并且是互质的情况 void init()
{
dp[3]=1;
for(int i=4;i<N;i++)
{
dp[i]=dp[i-1]+(i-1)/2-i/3+(i%3?0:1); //b==c的情况
if(!(i&1)) //当前一个为奇数
dp[i]-=i/4; //减去,递推中不满足要求的部分
dp[i]=dp[i]%M;
if(dp[i]<0)
dp[i]+=M;
}
bin[1]=1;
for(int i=2;i<N;i++)
{
bin[i]=(bin[i-1]<<1)%M;
for(int j=2;i*j<N;j++)
{
dp[i*j]-=dp[i]; //减去一个三角形中三边不互质的部分,,
if(dp[i*j]<0) //也就是对应的约数的dp[i],对于每个互质的小的a,b,c 对应一个j*a,j*b,j*c
dp[i*j]+=M;
}
}
return ;
} int main()
{
int n,ca=0; init();
//printf("%I64d\n",dp[3]); while(scanf("%d",&n)!=EOF)
{
int ans=0;
for(int i=1;i*i<=n;i++)
{
if(n%i)
continue;
ans=(ans+1LL*dp[i]*bin[n/i])%M; //中间乘法可能会溢int
if(i*i!=n)
ans=(ans+1LL*dp[n/i]*bin[i])%M;
}
printf("Case %d: %I64d\n",++ca,ans);
}
return 0;
}

hdu-4466-Triangle 数学题的更多相关文章

  1. HDU 5914 Triangle 数学找规律

    Triangle 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Description Mr. Frog has n sticks, who ...

  2. hdu 4324 Triangle LOVE

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4324 Triangle LOVE Description Recently, scientists f ...

  3. hdu 5587 Array 数学题

    Array Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5587 De ...

  4. HDU 5914 Triangle 【构造】 (2016中国大学生程序设计竞赛(长春))

    Triangle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  5. HDU 5914 Triangle(打表——斐波那契数的应用)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Problem Description Mr. Frog has n sticks, whos ...

  6. HDU 6467 简单数学题 【递推公式 && O(1)优化乘法】(广东工业大学第十四届程序设计竞赛)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6467 简单数学题 Time Limit: 4000/2000 MS (Java/Others)    M ...

  7. HDU 4324 Triangle LOVE 拓扑排序

    Problem Description Recently, scientists find that there is love between any of two people. For exam ...

  8. HDU 4324 Triangle LOVE (拓扑排序)

    Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  9. HDU 6467.简单数学题-数学题 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)

    简单数学题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  10. hdu 6512 Triangle

    Problem Description After Xiaoteng took a math class, he learned a lot of different shapes, but Xiao ...

随机推荐

  1. 高能天气——团队Scrum冲刺阶段-Day 4

    高能天气--团队Scrum冲刺阶段-Day 4 今日完成任务 于欣月:基本实现课程表功能:每一个设置课程表的地方设置一个EditText和一个TextView,根据我们学校的课程情况设置了25个Edi ...

  2. Java string.valueof的用法以及与parseint的区别

    一.由基本数据型态转换成String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 ,也就是 String.valueOf() 这个参数多载的方法 有以下几 ...

  3. Python3 BP神经网络

    转自麦子学院 """ network.py ~~~~~~~~~~ A module to implement the stochastic gradient descen ...

  4. 【*】单线程的redis为什么吞吐量可以这么大

    一.Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非 ...

  5. codevs 1077 多源最短路

    题目描述 Description 已知n个点(n<=100),给你n*n的方阵,a[i,j]表示从第i个点到第j个点的直接距离. 现在有Q个询问,每个询问两个正整数,a和b,让你求a到b之间的最 ...

  6. Linux下实现自动设置SSH代理

    SSH的巨大价值体现在能够配置为代理服务器上.不像在Windows下每次还需要手动登录设置,Linux有很好的工具链能够实现自动设置SSH代理,就是expect和ssh的联合使用,再加上proxych ...

  7. 国内代码托管git-osc基础使用教程

    git-osc是开源中国社区团队推出的基于Git的快速的.免费的.稳定的在线代码托管平台,不限制私有库和公有库数量.国内同类的有taocode.SVNchina等等 个人更喜欢git-osc的界面与操 ...

  8. 在Asp.net core中使用WebScocket

    今天小试了一下在Asp.net core中使用websocket,这里记录一下: 在 Startup 类的 Configure 方法中添加 WebSocket 中间件. app.UseWebSocke ...

  9. Beego开源项目 收藏

    官方收藏的项目 集成开发平台:基于 Golang 的快速开发平台,平台已经集成权限管理,菜单资源管理,域管理,角色管理,用户管理,组织架构管理,操作日志管理等等 OPMS - 是一款项目管理 + OA ...

  10. OFbiz--简单介绍

    一.简单介绍 OFBiz是一个很著名的电子商务平台,是一个很著名的开源项目,提供了创建基于最新J2EE/XML规范和技术标准,构建大中型企业级.跨平台.跨数据库.跨应用server的多层.分布式电子商 ...