本文主要是介绍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;
}
这篇关于XTU-OJ 1187-Candy的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!