目录
- 🍋题目描述
- 🍋思路
- 三重暴力:超出时间溢出
- 数学分析
- 🍋源代码
- 三重暴力:超出时间溢出
- 数学分析
🍋题目描述
🍋思路
三重暴力:超出时间溢出
想的是暴力。
三重for循环。
每一重代表一份。
三重则三份。
结果超出时间限制了。
时间复杂度还是太大了。
等想到方法了,再补充把
数学分析
不暴力循环了。
从1到n,我们直接算出有多少个能直接被3整除的数,多少个被3除余1的数,多少个被3除余2的数。
之后就直接数学分析。
从直接被3整除的数中挑选三个,必然满足条件。被3除余1的数,被3除余2的数,也是一样。
之后从这三者中各挑选一个也成立。
以上四种情况就全考虑到了。
需要注意的点是,整型存储时,数值很大,用long。
🍋源代码
三重暴力:超出时间溢出
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);
}
}
}
数学分析
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);
}
}
}