0
点赞
收藏
分享

微信扫一扫

XTUOJ 1187 Candy


目录

  • ​​🍋问题描述​​
  • ​​🍋解题思路​​
  • ​​🍋解题代码​​

🍋问题描述

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

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

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

样例输入
3
4
5
0
样例输出
1
2
4
作者
WCB,Eric

🍋解题思路

一开始想的是暴力。
三重for循环。
每一重代表一份。
三重则三份。
结果超出时间限制了。
时间复杂度还是太大了。

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(true) {
int n=in.nextInt();
if(n==0) return;

long sum=0;
for(int i=1;i<=n-2;i++) {
for(int j=i+1;j<=n-1;j++) {
for(int k=j+1;k<=n;k++) {
if((i+j+k)%3==0)
sum=(sum+1)%1000000009;
}
}
}
System.out.println(sum);
}
}

}

之后发现这个最终还是数学问题。
把数字分类。对3取余为0,取余为1,取余为2.
之后就是数学思想的计算。

🍋解题代码

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(true) {
int n=in.nextInt();
if(n==0) return;
int t=n%3;
long x=n/3%1000000007;
long y=0,z=0;
if(t==0) {
y=x;
z=x;
}
else if(t==1) {
y=x+1;
z=x;
}else {
y=x+1;
z=x+1;
}
long sum=0;
sum=((x*(x-1)*(x-2))/6 +(y*(y-1)*(y-2))/6+(z*(z-1)*(z-2))/6+x*y*z)%1000000007;
System.out.println(sum);
}
}
}


举报

相关推荐

0 条评论