首页 > 其他分享 >洛谷题单指南-暴力枚举-P3799 妖梦拼木棒

洛谷题单指南-暴力枚举-P3799 妖梦拼木棒

时间:2024-02-02 11:24:41浏览次数:27  
标签:妖梦 木棒 洛谷题 中选 long int 枚举 P3799 长度

原题链接:https://www.luogu.com.cn/problem/P3799

题意解读:要选四根木棒拼成等边三角形,必然有两根长度相等,其余两根长度之和等于前两根

解题思路:

木棒总数最大100000,每根最长5000,因此通过枚举其中两根木棒的长度,计算出另外两根的长度,通过各个长度的木棒数进行选择。

设数组h[n]保存每种长度木棒的数量, 设四根木棍长度为a < b < c = d

枚举a,b的长度, a从1~5000,b从a~5000,且需要符合a + b <= 5000

如果a == b,则在长度为a的木棒中选2个,即C(h[a], 2),再在长度为a + b的木棒中选2个,即C(h[a+b], 2),

根据乘法原理,方案数为C(h[a], 2) * C(h[a+b], 2)

如果a != b,则在长度为a的木棒中选1个,即C(h[a], 1),在长度为b的木棒中选1个,即C(h[b], 1),再在长度为a + b的木棒中选2个,即C(h[a+b], 2),

根据乘法原理,方案数为C(h[a], 1) * C(h[b], 1) * C(h[a+b], 2)

注意每一次计算中需要对1e9 + 7取模。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 5005;
const int MOD = 1e9 + 7;

long long h[N];
long long ans;
int n;

long long C(long long a, int b)
{
    if(b == 1) return a;   // 计算C(a, 1)
    else return a * (a - 1) / 2 % MOD; // 计算C(a, 2)
}

int main()
{
    cin >> n;
    int x;
    for(int i = 1; i <= n; i++)
    {
        cin >> x;
        h[x]++;
    }

    for(int i = 1; i <= 5000; i++) //枚举第一根木棒,设定第一根最短
    {
        for(int j = i; i + j <= 5000; j++) //枚举第二根,第二根大于等于第一根,且两者之后不超过最大长度
        {
            if(h[i + j] < 2) continue;

            if(i != j && h[i] && h[j]) //选一个i,选一个j,选两个i+j
            {
                ans += C(h[i], 1) * C(h[j], 1) * C(h[i + j], 2) % MOD;
            }

            if(i == j && h[i] >= 2) //选两个i,选两个i+j
            {
                ans += C(h[i], 2) * C(h[i + j], 2) % MOD;
            }
        }
    }

    cout << ans % MOD;

    return 0;
}

 

标签:妖梦,木棒,洛谷题,中选,long,int,枚举,P3799,长度
From: https://www.cnblogs.com/jcwy/p/18002826

相关文章

  • 洛谷题单指南-暴力枚举-P1149 [NOIP2008 提高组] 火柴棒等式
    原题链接:https://www.luogu.com.cn/problem/P1149题意解读:计算符合A+B=C时,火柴棍数量正好等于n,可以采用枚举A、B,然后计算出C,根据A、B、C计算出所有火柴棍数量,再加上4根加号、等号的,如果与n相等,即为一种合法等式。解题思路:题目的关键在于枚举A、B时,最大值的设定,不能超时。分析......
  • 洛谷题单指南-暴力枚举-P1217 [USACO1.5] 回文质数 Prime Palindromes
    原题链接:https://www.luogu.com.cn/problem/P1217题意解读:本题要找[a,b]范围内的所有回文质数,千万不要被题目提示所干扰,如果按照提示先产生各个长度的回文数,再依次判断是否是素数,程序写起来比较繁琐,需要根据a、b的长度,写8个判断是否产生1~8位回文数,最后做素数判断。换一个思路......
  • 洛谷题单指南-暴力枚举-P3654 First Step (ファーストステップ)
    原题链接:https://www.luogu.com.cn/problem/P3654题意解读:在r*c矩阵中,找连续k个.的总数。解题思路:本题直接枚举即可,在每一行中,以每一列为起点,连续判断k个元素,如果全为'.',则方案数加1在每一列中,以每一行为起点,连续判断k个元素,如果全为'.',则方案数加1注意:如果k=1,只有一个人......
  • 洛谷题单指南-暴力枚举-P3392 涂国旗
    原题链接:https://www.luogu.com.cn/problem/P3392题意解读:此题枚举白、蓝、红所有可能的行数组合,依次逐行判断每个方格,是否需要染色,计算最少的染色次数即可。解题思路:总行数是n,先考虑白色,第一行必是白色,最后一行必是红色,至少有一行蓝色,因此白色行数的范围是1~n-2再考虑蓝......
  • 洛谷题单指南-暴力枚举-P1088 [NOIP2004 普及组] 火星人
    原题链接:https://www.luogu.com.cn/problem/P1088题意解读:火星人的手指可以通过全排列来表示数字,全排列由小到大的顺序即为表示的数字大小,题目可以转化为:给定按顺序全排列中的某一个排列,求往后数m个排列的内容。解题思路:此题与经典全排列问题的差异在于,需要从指定一个排列开......
  • 洛谷题单指南-暴力枚举-P1706 全排列问题
    原题链接:https://www.luogu.com.cn/problem/P1706题意解读:n个数全排列问题,本质上,给定n个空位,枚举每个能填入空位的数,依次填入,每个数只能填一次。解题思路:如何填入n个数呢,可以借助于递归,流程如下:dfs(填入第k个数){如果已经填满n个数输出结果返回......
  • 洛谷题单指南-暴力枚举-P1157 组合的输出
    原题链接:https://www.luogu.com.cn/problem/P1157题意解读:在1~n的数中挑选r个,有多少种组合,与P1036类似,有两种做法:二进制法、DFS,下面给出DFS版的代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=25;intn,r;intt[N];voiddfs(intk){......
  • 洛谷题单指南-暴力枚举-P1036 [NOIP2002 普及组] 选数
    原题链接:https://www.luogu.com.cn/problem/P1036题意解读:题目即要在n个数中,枚举出所有的子集,当子集中数字个数刚好为k时,求和,判断是否是素数。解题思路:方法一:二进制法通过二进制法,可以枚举一个集合中所有元素“选”或者“不选”的情况,用二进制1表示选该元素,二进制0表示不选。......
  • 洛谷题单指南-暴力枚举-P1618 三连击(升级版)
    原题链接:https://www.luogu.com.cn/problem/P1618题意解读:枚举所有三位数的组合情况,判断是否符合比例。解题思路:方法一:枚举第一个数根据题意,目的是寻找三个符合比例的三位数,可以直接枚举第一个,最小是123,最大是987设第一个数为x,三个数的比例关系是a:b:c设另外两个数为y,z那么,根......
  • 洛谷题单指南-暴力枚举-P2241 统计方形(数据加强版)
    原题链接:https://www.luogu.com.cn/problem/P2241题意解读:要在整个n*m区域计算正方形和长方形的个数,枚举法即可。解题思路:此题枚举的对象是矩形的高i和宽j,高的范围[1,n],宽的范围[1,m],然后计算在n*m区域内有多少个i*j,i==j即属于正方形,i!=j属于长方形。那么,问题就集中在了......