题目背景
扶苏的梦想是在椰奶国生活。这个国度的成员都是可爱的椰奶,椰奶们无需在意外面的世界,快乐地生活在椰奶国里。
题目描述
椰奶国的一天共有 n 个小时。第 i 个小时(0≤i<n)共有 i+1 分钟,第 i 个小时的第 j 分钟(0≤j≤i)共有 10j+1 秒。
注意,这里小时、分钟、秒数都是从 00 起计数。
现在,给出起始时刻 t1=A:B:C,表示 t1 时刻是 A 时 B 分 C 秒,和结束时刻 t2=E:F:G,表示 t2 时刻是 E 时 F 分 G 秒。
已知时刻 t2 的时刻不早于 t1 的时刻,且二者时间间隔小于一天。
请你求出t1 和 t2 之间经过了多少秒。
输入格式
本题单个测试点内有多组测试数据。第一行是一个整数,表示数据组数 T。
接下来 T 行,每行七个整数,依次表示一组数据的 n,A,B,C,E,F,G。
输出格式
对每组数据,输出一行一个整数表示答案。
输入输出样例
输入 #1复制
1 10 3 2 11 3 3 0
输出 #1复制
10
输入 #2复制
1 2 1 1 3 0 0 0
输出 #2复制
8
ε=(´ο`*)))唉!扶苏你舍密斯?和我抢王小美?椰奶有那么好喝吗?(是挺好喝的,爱喝)
在暴力的基础上更进一步,发现每个小时都有:
∑j=0i(j×10+1)
秒。
再使用高斯求和公式:
(n+1)×2n
就可以变为:
(i+1)×2i×(i×10+1)
时间复杂度足以通过题目,但是呢有可能不是在同一天,怎么办呢?只要用差值取模一天的秒数即可。但是在数据量大时会有偏差,所以还要加上一天的秒数。
#include <bits/stdc++.h>
using namespace std;
int main(){
long long t;
cin>>t;
while(t--){
long long n,a,b,c,d,e,f,ans1=0,ans2=0,day=0;
cin>>n>>a>>b>>c>>d>>e>>f;
for(long long i=0;i<n;i++){
day+=i+1+i*(i+1)/2*10;
}
for(long long i=0;i<a;i++){
ans1+=i+1+i*(i+1)/2*10;
}
ans1+=b+b*(b-1)/2*10;
ans1+=c;
for(long long i=0;i<d;i++){
ans2+=i+1+i*(i+1)/2*10;
}
ans2+=e+e*(e-1)/2*10;
ans2+=f;
cout<<(ans2-ans1+day)%day<<endl;
}
return 0;
}
就AC了!
扶苏姐姐给我留点椰奶!