黑工程大铁门!进过吗你!
2024-11-30 20:43:13
发布于:黑龙江
23阅读
0回复
0点赞
这个题从后往前推导,我们假设前k天需要过的铁门为all;
将all分为两部分,第一部分为有规律的阶乘和,另一部分为多余部分天数,
第一部分:
假设末尾天需要过m道铁门
那么由天数我们可得出一元二次方程(1+m)m/2=k;
m也就是(pow(1+8k,0.5)-1)/2【注:pow为指数,在此过程将1+8k开方】
之所以为第一部分,是因为整数类型会自动将小数部分省略,那小数部分作为第二部分另算
由题,第一部分也就是1+22+33+44...+m*m
化简也就是(1+m)m/2+(2+m)(m-1)/2+...+m,
第二部分的天数也就是day=k-(1+m)m/2;【1+2+3+4+...+m】
因此由循环写出第一部分的铁门数
第二部分:
剩下的天数不满完整阶乘,因此直接加上去即可:day(m+1)【m+1是因为第一部分到作完整阶乘和】
代码如下:
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int main(){
long long k,all=0,day;
cin>>k;
long long m=(pow(1+8*k,0.5)-1)/2;
day=k-(1+m)*m/2;
for(int i=1;i<=m;i++){
all+=(i+m)*(m-i+1)/2;
}
all+=day*(m+1);
cout<<all;
}
这里空空如也
有帮助,赞一个