zoukankan      html  css  js  c++  java
  • 【CZY选讲·Triangle】

    题目描述

    长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形。你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法。

    数据范围

    1≤≤10^6


    题解:

         ①相似三角形一定可以找到最小的那个,称为这类相似三角形的基。

         ②剩下就是一包夹杂容斥的递推:
         ③设w[i]为长度为i的铁丝的分法,一种分法的所有三角形边长除以gcd(a,b,c)得到的三角形都一样,且三边互质,设边长为a',b',c'。

         ④若M=a+b+c,M'=a'+b'+c',设k=M/M',那么以a',b',c'为三边的三角形为基,用长度为M的铁丝能做出的方案数为2^(k-1) (杨辉三角第k层数字和公式)。

         ⑤设g[i]为长度为i的铁丝分成边长为a,b,c(a<=b<=c)且gcd(a,b,c)=1的三角形的方案数。那么

               w[i]=g[p1]*2^(i/p1-1)+g[p2]*2^(i/p2-1)+…+g[pk]*2^(i/pk-1)(p为i的因数)。

         ⑥设f[i]为长度为i的铁丝分成边长为a,b,c(a<=b<=c)的三角形的方案数。那么

               g[i]=f[i]-f[p1]-f[p2]-…-f[pk](p为i的因数)。(注意此处的f相当于g了,因为是f在刷新自己,因此不会出现因倍数而导致重复情况)

          ⑦接下来处理三角形三边合法(即f的递推):

           1.b==c,c最小为ceil(i/3),最大为floor((i-1)/2) 。

           2.b<=b<=c-1的方案数,为f[i-1]。

           第二种情况还要除去a+b=c的方案数。

           若a+b=c,那么i=a+b+c=2*(a+b),a+b=i/2,

           这样的(a,b)有i/2/2对,此时i一定为偶数,所以i为偶数时要考虑这种情况

           (⑦部分要好好理解)

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    const int N=5000005,mod=1000000007;
    int n,ans,cnt;
    int f[N],p[N];
    int main(){
        p[1]=1;
        for(int i=2;i<=N;i++)p[i]=(p[i-1]*2)%mod;
        f[3]=1;
        for(int i=4;i<=N;i++){
            f[i]=f[i-1]+(i-1)/2-i/3+(i%3?0:1);
            if(i%2==0)f[i]-=i/4;
            f[i]%=mod;
            if(f[i]<0)f[i]+=mod;
        }       
        for(int i=2;i<=N;i++)
            for(int j=2;i*j<=N;j++){
                f[i*j]-=f[i];
                if(f[i*j]<0)f[i*j]+=mod;
            }
        while(~scanf("%d",&n)){
            ans=0;
            for(int i=1;i*i<=n;i++){
                if(n%i!=0)continue;
                ans=(ans+1ll*f[i]*p[n/i])%mod;
                if(i*i!=n)ans=(ans+1ll*f[n/i]*p[i])%mod;    
            }
            printf("Case %d: %d
    ",++cnt,ans);      
        }
        return 0;
    }

    我奋力地穿越空旷和迷墙,在我的路上寻找生命的意义。——————汪峰《我的路》

     

        

  • 相关阅读:
    jfreechart各种图表生成源码练习
    已知两圆圆心坐标及半径求两圆交点 (C语言|参数方程求解)
    关于“Internet Explorer无法打开站点,已终止操作”的解决方法
    用批处理编译VC2008工程
    NET 3.5 SP1和VS2008 SP1 Beta版
    "Couldn't find installable ISAM."这条错误信息,什么含义?
    ArcGIS Server 开发系列(二)Web ADF 编程 (转载于Flyingis)
    ArcGIS Server 开发系列(一)编程框架总览 (转载于Flyingis)
    雅虎公司C#笔试题
    datagrid的即时刷新
  • 原文地址:https://www.cnblogs.com/Damitu/p/7654485.html
Copyright © 2011-2022 走看看