其他分享
首页 > 其他分享> > 题解 P3799 【妖梦拼木棒】

题解 P3799 【妖梦拼木棒】

作者:互联网

无良宣传一下博客wwwwww
文章列表 - 核融合炉心 - 洛谷博客


知识点:组合数学/暴力枚举





附 \(AC\) 代码 :

#include<cstdio>
#include<ctype.h>
#define int long long
#define max(a,b) a>b?a:b
//======================================================= 
const int MARX = 1e6+10;
const int mod = 1e9+7;
int n,ans,maxa;
int a[MARX],num[MARX];
//=======================================================
inline int read()
{
    int fl=1,w=0;char ch=getchar();
    while(!isdigit(ch) && ch!='-') ch=getchar();
    if(ch=='-') fl=-1;
    while(isdigit(ch)){w=w*10+ch-'0',ch=getchar();}
    return fl*w;
}
inline int C(int x,int k)//求得从n个数中取出k个数的组合 
{
    return k==1?x:x*(x-1)/2;
}
//=======================================================
signed main()
{
    n=read();
    for(int i=1;i<=n;i++)//读入,并放入桶中 
      a[i]=read(),
      maxa=max(a[i],maxa),
      num[a[i]]++;
      
    for(int i=2;i<=maxa;i++)//枚举两根相等的边 
      if(num[i]>=2)
        {
          int times = C(num[i],2)%mod;//求出组合数 
          for(int j=1;j<=i/2;j++)//枚举被合成的边(枚举到i/2即可)
            {
              if(j!=i-j && num[j]>=1 && num[i-j]>=1)//当用来合成的木棒长度不等 
                ans=(ans + times*C(num[j],1)%mod*C(num[i-j],1)%mod)%mod;
              if(j==i-j && num[j]>=2)//当用来合成的木棒长度相等 
                ans=(ans + times*C(num[j],2))%mod;
            }
        }
    
    printf("%lld",ans%mod);
}

完成了这篇题解 , 车万众信仰\(++\)


标签:ch,妖梦,木棒,题解,int,num,P3799,ans,长度
来源: https://www.cnblogs.com/luckyblock/p/11456240.html