当前位置: 首页 > article >正文

XTU-OJ 1187-Candy

WCB某天买了非常多的糖果并把它们分成N份,依次分别有1,2,3…,N个糖果。他想拿出其中的3份分给他的室友, 为了不让室友们闹意见,必须让这三份的糖果总数恰好能被三人均分。请问他一共有多少种不同的组合方案数?

输入

有多组输入数据,每组输入非负整数N(3≤N≤106),如果N=0,表示输入结束,这个样例不需要处理。

输出

每组数据输出一个整数独占一行,表示共有多少种方案,由于可能会很大,最后结果对109+7取模。

样例输入
3 
4 
5 
0
样例输出
1 
2 
4

解题思路:这题题目也说了就是一道排列组合题。 有哪些组合,可以让三份的糖果总数恰好能被三人均分?   

1:三份糖果 模3余数均为1 的 糖果;

2:三份糖果 模3余数均为2 的 糖果;

3:三份糖果 模3余数均为0 的 糖果;

4:一份糖果 模3余数为1 的 糖果 + 一份糖果 模3余数均为2 的 糖果 + 一份糖果 模3余数均为0 的 糖果。

最后对这4种情况的组合数求和就行了。   (注意取模 和 爆int )

AC代码:

#include <stdio.h>

const int Mod = 1e9+7;
int compute(__int64 s){                         // 组合数公式 C(n,3)
    return (s*(s-1)*(s-2)/6) % Mod;
}

int main()
{
    int n,N;
    __int64 x,y,z;
    __int64 ans1,ans2,ans3,ans;
    while (scanf("%d",&N) != EOF && N != 0)
    {
        x = N/3;                                // x:3的倍数的 个数
        y = z = x;
        n = N%3;
        if (n == 1)         y += 1;             // y:模3余1的数 的个数
        else if (n == 2)    y += 1, z += 1;     // z:模3余2的数 的个数
        ans1 = compute(x);
        ans2 = compute(y);
        ans3 = compute(z);
        ans = (ans1+ans2+ans3+x*y*z) % Mod;
        printf("%I64d\n",ans);
    }
    return 0;
}


http://www.kler.cn/a/104218.html

相关文章:

  • RocketMQ生产环境常见问题分析与总结
  • 微服务-Ribbon负载均衡
  • 【Python机器学习】零基础掌握VotingRegressor集成学习
  • 有六家机器视觉公司今年11月份初放假到明年春节后,除夕不放假看住企业不跑路,不倒闭,明年大家日子会越来越甜
  • rust学习—— 复合类型结构体、复合类型枚举、复合类型元组
  • 01、yudao-项目简介、功能列表、技术选型.md
  • LinkedHashMap 简单实现LRU
  • Windows10系统安装telnet命令
  • python html(文件/url/html字符串)转pdf
  • MobileNetV3
  • 分享个包含各省、市、区的编码数据的在线静态资源脚本
  • PyCharm 安装 cx_Oracle 失败
  • c语言从入门到实战——分支和循环
  • Kubernetes (K8S)概述
  • Kubernetes技术与架构-网络 3
  • 上游服务不可用了,下游服务如何应对?
  • 3682: 【C3】【递推】台阶问题
  • 【Linux Screen命令】Linux用户注销后可长时间运行的命令行
  • React 核心与实战2023版
  • IP地址在网络安全中的关键作用