hdu-4466-Triangle 数学题
题目链接:
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*cdp[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; //中间乘法可能会溢intif(i*i!=n)ans=(ans+1LL*dp[n/i]*bin[i])%M;}printf("Case %d: %I64d\n",++ca,ans);}return 0;
}
hdu-4466-Triangle 数学题相关推荐
- HDU 4466 Triangle(计数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4466 题意:给出一根长度为n的铁丝.将其分成若干段并将每段折成一个三角形,使得三角形都相似.有多少种分 ...
- HDU 4466 Triangle(12年成都)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题目:给出长度为n的铁丝,将铁丝分为若干 部分,每 ...
- HDU - 4466 Triangle
题目:给你一根长度为n的铁丝,将铁丝分成几部分,再把每部分都折成三角形,并且每个三角形都相似,而且三角形的边长是整数.问有多少种分法. 三角形三遍相等视为相等,三角形顺序不同视为不同 思路:设三角形3 ...
- HDU 4466 Triangle
传送门 我们枚举x=a+b+cx=a+b+c,枚举aa,a<=b<=ca 把c=x−a−bc=x-a-b代入下面的不等式中,可以得到bb的范围 a+b>ca+b>c a+c&g ...
- hdu 4466 Triangle dp+数学
分析 我们总共有n长的绳子,要求给绳子分段,每段都可以组成三角形,且所有三角形相似,三角形有顺序,问方案数 我们可以考虑一个F(x)F(x)F(x)为周长为x的三角形的个数 考虑三边a<=b&l ...
- hdu 4466 Triangle (数学)
终于做完了这道题,发一下自己的理解,踩踩~~ 题意:给你一个长度n的铁丝,将它弯成一个三角形,或者分成m段,每段组成一个三角形,要求这些三角形相似,问有多少种不同的方案数? 题解: 设f[x] 表示 ...
- HDU 5914 - Triangle
题目 HDU 5914 Triangle Problem Description Mr. Frog has n sticks, whose lengths are 1,2, 3⋯n respectiv ...
- hdu 4324 Triangle LOVE
http://acm.hdu.edu.cn/showproblem.php?pid=4324 比赛的时候 脑子又短路了 "between A and B, if A don't love B ...
- HDU 5914 Triangle 数学找规律
Triangle 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Description Mr. Frog has n sticks, who ...
- HDOJ 4466 Triangle 递推
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. ...
最新文章
- 为git服务器配置gitosis管理权限
- 策略模式(封装一系列的功能,使之可以相互替换)
- 什么是动态语言(转)
- [PM Tools]软件项目进度跟踪表v4.0
- Java可能使用UTF-8作为其默认字符集
- 分解 python_面试官:如何用Python实现将一个整数分解成质因数?
- 成功人士都是这样逼出来的
- 字节跳动和腾讯不正当竞争案将于深圳开庭 抖音:我们也是看新闻才知道本月24日要开庭...
- 检查PHP扩展是否安装成功
- 旧金山散记(一):第一次在美国打车
- chrome extensions快捷键shortcuts配置
- 实战|淘宝用户行为分析案例
- 七月流火,让我们共享一场开源数据库的饕餮盛宴
- ftp客户端中文乱码问题解决
- 黑客帝国神级影评,转至豆瓣。 — — 哲思。
- win10自带图片出现文件系统错误 (-2147219196)的修复方法
- steam++工具箱
- Verilog状态机详述
- 2019 年最佳 Linux 笔记本电脑发行版 top10
- AI 黑科技,老照片修复,模糊变高清