• 2018-2019 ACM-ICPC, Asia Nanjing Regional Contest G. Pyramid(组合数学 计数)


    题目

    t(t<=1e6)组样例,每次给定一个n(n<=1e9),统计边长为n的上述三角形的等边三角形个数

    其中等边三角形的三个顶点,可以在所有黑色三角形&白色三角形的顶点中任取,

    答案对1e9+7取模

    思路来源

    申老师 & oeis A000332

    Solution to Problem #3

    题解

    oeis打一下前四项的表,发现是C(n,4),并且还有说明,

    是等于长度为n时的等边三角形,任取顶点时,不限边长大小的等边三角形个数

    看了一下证明,感觉也是变相计数,这里提供一种计数方式,可能赛中还是会选择打表

    计数方式

    对于边长为n的三角形,三个点都在三角形的三条边上的方案,恰有n种

    图示分别对应n=2,3,4的情形,

    所以,可以枚举每个边长i,统计边长=i的正向的三角形的个数,每个的贡献是i

    因为倒立的边长为i的三角形,会在正向为2*i的三角形中被枚举到,所以忽略

    归纳/找规律可发现,边长为n-i+1的正向三角形的出现次数是i*(i+1)/2,有下式成立:

    \sum_{i=1}^{n}\frac{i*(i+1)}{2}*(n-i+1)

    =\sum_{i=1}^{n}C_{i+1}^{2}*C_{n+2-(i+1)}^{1}

    =C_{n+3}^{4}

    恒等式的组合意义

    从n+3个数选4个数时,可以枚举第三个数的位置,左边i+1个位置选2个,右边选1个

    但是确实没有看出来其与三角形选择方法的关联关系

    代码

    输出C(n+3,4)即可,即(n+3)*(n+2)*(n+1)*n/24

    1. #include
    2. using namespace std;
    3. #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    4. #define per(i,a,b) for(int i=(a);i>=(b);--i)
    5. typedef long long ll;
    6. typedef double db;
    7. typedef pair<int,int> P;
    8. #define fi first
    9. #define se second
    10. #define dbg(x) cerr<<(#x)<<":"<" ";
    11. #define dbg2(x) cerr<<(#x)<<":"<
    12. #define SZ(a) (int)(a.size())
    13. #define sci(a) scanf("%d",&(a))
    14. #define pb push_back
    15. #define all(a) a.begin(),a.end()
    16. #define pt(a) printf("%d",a);
    17. #define pte(a) printf("%d\n",a)
    18. #define ptlle(a) printf("%lld\n",a)
    19. #define debug(...) fprintf(stderr, __VA_ARGS__)
    20. std::mt19937_64 gen(std::chrono::system_clock::now().time_since_epoch().count());
    21. ll get(ll l, ll r) { std::uniform_int_distribution dist(l, r); return dist(gen); }
    22. const int mod=1e9+7,inv2=(mod+1)/2,inv6=(mod+1)/6;
    23. int t,n;
    24. int sol(int x){
    25. int a=1ll*(n+3)*(n+2)%mod*inv6%mod;
    26. int b=1ll*(n+1)*n%mod*inv2%mod*inv2%mod;
    27. return 1ll*a*b%mod;
    28. }
    29. int main(){
    30. sci(t);
    31. while(t--){
    32. sci(n);
    33. printf("%d\n",sol(n));
    34. }
    35. return 0;
    36. }

  • 相关阅读:
    iMazing2023最新版本下载及使用教程
    蓝桥杯每日一题2023.9.21
    基于C++的简单ANN(人工神经网络)模型
    好用又方便的浏览器主页,整合丰富资源,功能很齐全
    【网络安全---XSS漏洞(1)】XSS漏洞原理,产生原因,以及XSS漏洞的分类。附带案例和payload让你快速学习XSS漏洞
    SpringBoot 日志
    虚拟机错误集
    操作系统的概念、四个特征以及os的发展和分类
    Primer笔记——显式转换、返回数组指针的函数、const形参函数重载
    stream流参数总结
  • 原文地址:https://blog.csdn.net/Code92007/article/details/133850475