终于做完了这道题,发一下自己的理解,踩踩~~

题意:给你一个长度n的铁丝,将它弯成一个三角形,或者分成m段,每段组成一个三角形,要求这些三角形相似,问有多少种不同的方案数?

题解:

设f[x] 表示 三角形三边之和为x 的三角形的个数 ,a b c分别为三角形的三边,并且满足a<=b<=c;

当b==c时:a=1时c取到最大值为maxx= [(x-1)/2], a=b=c时c取到最小值为minx=ceil(x/3) ,所以总共有maxx-minx+1;

当b!=c 时:(该题的第一个亮点啊)

由于 b<c即b<=c-1 三角形(a,b,c-1)也必为一个合理的三角形,则可以由f[x-1] 推到当前符合条件的三角形的个数

当然还有一种特殊情况需要排除,即 前一个状态里 a+b=c+1 的三角形的个数,推到当前状态可知 a+b=c,a+b+c=x

则 a+b=c=x/2; a 可以从 1 取到 [(x/2)/2], 共有 [(x/2)/2] 种情况;

以上我们可以得到f[x] 的所有结果

怎么样求解题目呢?

长度为n的铁丝,可以分成d 段(n%d==0) ,每段都可以组成一个小的三角形,也可以将其中的几段合并,构成一个大的并且和小三角形相似的三角形,共有 2^(n.d-1)种组合方式,则最终的结果为    sum( f[d] * ( 2^(n/d-1) ) )

到这里还没有结束,应为用我们之前计算出来的f[x] 进行计算,答案会偏大,有重复计算,所以  (题目的第二个亮点啊)

令f [x] 中计算的三角形a,b,c满足gcd(a,b,c)=1;删选过程很简单,如果n%d==0 则 f[n] 中一定包含着f[d] 中所以三角形扩展 n/d 倍后形成的三角形,减去这部分就可以了;

此时这道题就真的完结了!!!

最后提醒一下,注意取模时超int

#include <iostream>
#include<cstdio>
#include<memory.h>
#include<math.h>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
const unsigned int maxn=5000000+10;
const int MOD=1000000000+7;
unsigned int fac[maxn];
unsigned int f[maxn];
void init()
{fac[0]=1;fac[1]=2;fac[2]=4;f[3]=1; f[0]=f[1]=f[2]=0;ll s1,s2;ll tmp;for(int x=4;x<=5000000;x++){s1=ceil(x*1.0/3);s2=(x-1)/2;tmp=(f[x-1]+s2-s1+1)%MOD;f[x]=tmp;if(x%2==0){tmp=(f[x]-(ll)((x/2)/2)+MOD)%MOD;f[x]=tmp;}}for(int x=3;x<=5000000;x++){fac[x]=(fac[x-1]*2)%MOD;for(int y=2;x*y<=5000000;y++){tmp=((ll)f[x*y]-f[x]+MOD)%MOD;f[x*y]=tmp;}}
}
int main()
{//freopen("in.txt","r",stdin);init();int n,tcase=0;while(~scanf("%d",&n)){printf("Case %d: ",++tcase);if(n<3){printf("0\n");continue;}else{ll ans=0;for(int i=1;i*i<=n;i++) if(n%i==0){ans+=((ll)f[i]*fac[n/i-1])%MOD;ans=ans%MOD;if(i*i!=n) ans=(ans+((ll)f[n/i]*fac[i-1])%MOD)%MOD;}printf("%I64d\n",ans);}}return 0;
}

hdu 4466 Triangle (数学)相关推荐

  1. hdu 4466 Triangle dp+数学

    分析 我们总共有n长的绳子,要求给绳子分段,每段都可以组成三角形,且所有三角形相似,三角形有顺序,问方案数 我们可以考虑一个F(x)F(x)F(x)为周长为x的三角形的个数 考虑三边a<=b&l ...

  2. HDU 4466 Triangle(计数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4466 题意:给出一根长度为n的铁丝.将其分成若干段并将每段折成一个三角形,使得三角形都相似.有多少种分 ...

  3. HDU 5914 Triangle 数学找规律

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

  4. HDU 4466 Triangle(12年成都)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出长度为n的铁丝,将铁丝分为若干 部分,每 ...

  5. HDU - 4466 Triangle

    题目:给你一根长度为n的铁丝,将铁丝分成几部分,再把每部分都折成三角形,并且每个三角形都相似,而且三角形的边长是整数.问有多少种分法. 三角形三遍相等视为相等,三角形顺序不同视为不同 思路:设三角形3 ...

  6. 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 ...

  7. HDU 5914 - Triangle

    题目 HDU 5914 Triangle Problem Description Mr. Frog has n sticks, whose lengths are 1,2, 3⋯n respectiv ...

  8. hdu 4324 Triangle LOVE

    http://acm.hdu.edu.cn/showproblem.php?pid=4324 比赛的时候 脑子又短路了 "between A and B, if A don't love B ...

  9. Hdu 5339 Untitled (数学思维)

    题意:给一个数a和n个数b1,b2,...,bn. 从n个数中选择一些数重新排列成c1,c2,...,cm使得a%c1%c2%...%cm=0. 如果能选出则输出最少需要几个数,否则输出-1. 分析: ...

最新文章

  1. 将动态库添加到VC程序中
  2. docker删除镜像命令_第三章 Docker常用命令之镜像命令
  3. Tomat6架构探讨(二续)
  4. java -Math类
  5. VTK:PolyData之CopyAllArrays
  6. 从编译安装Keepalived 到 配置 负载均衡(LVS-DR)
  7. 如何获取url中的参数并传递给iframe中的报表
  8. WordPress主题:自媒体二号大前端模板
  9. Linux- 日常运维-w-查看系统负载
  10. 借教室(codevs 1217)
  11. linux安装jenkins配置环境变量,Ubuntu 16.04 安装Jenkins持续集成
  12. 微信小程序商城毕业设计毕设作品(4)开题报告
  13. python免费全套教程400集视频-如何入门 Python 爬虫?400集免费教程视频带你从0-1全面掌握...
  14. k8s关于Orphaned pod <pod_id> found,volume paths are still present on disk 的解决方法
  15. 指尖江湖鸿蒙抽奖,剑网三:指尖江湖 李忘生竞技场攻略
  16. 复变|第一章 复数与复变函数 复数
  17. flash as3_vinson_01:绘制扇形
  18. 对于K 均值聚类的尝试
  19. Android Google原生语音识别
  20. 【游戏逆向】CS1.6无后坐力基址寻找

热门文章

  1. 一套基础的C语言笔试题
  2. Sklearn标准化和归一化方法汇总(2):Min-Max归一化
  3. bashrc 与 zshrc的区别
  4. Java虚拟机之垃圾回收详解一
  5. 基于《环境影响评价技术导则生态影响》(HJ 19—2022)下的生态环境影响评价技术方法及图件制作与案例
  6. 临床预测之logictic回归 1-2
  7. 算法-斐波那契数列 java
  8. ASP+Access UTF-8 网页乱码问题解决办法
  9. 使用N2N搭建虚拟局域网进行游戏联机(服务端及客户端)
  10. 数据存储:数据备份:测试备份和还原