题解:AT_snuke21_a Candles
本题题意
给定一个数 \(n\),求 \(n\) 是否可以写成 \(1+2+3+4+\ldots+k\) 的形式。若可以,输出那个 \(k\),否则输出 \(-1\)。
思路
做法一:
暴力模拟 k。
code:
#include<iostream>
using namespace std;
long long n,candles=0;
int main(){
cin>>n;
for(int i=1;1;i++){
candles+=i;若不够,加一排蜡烛
if(candles==n){
cout<<i;若等于n,则输出那个k
return 0;
}
if(candles>n) break; 否则跳出
}
cout<<-1;
return 0;
}
过是能过。可是提交上去之后你会发现,时间最慢的直接给你飙到了 600ms 以上。
有没有快一点的方法呢,答案是有的。
前置知识:
做法二:
设 \(n=1+2+3+4+\ldots+k\),那么根据等差数列求和公式可得出
\[n=\frac{k\times(k+1)}{2} \\
\]
去分母得
\[2\times n={k\times(k+1)} \\
\]
由于 \(k^2<k\times(k+1)<(k+1)^2\),所以
\[k^2<2\times n<{(k+1)^2}
\]
同时开方得
\[k<\sqrt{2\times n}<{k+1}
\]
那么可以得出
\[k=\lfloor\sqrt{2\times n}\rfloor
\]
得出结论:用 \(k=\lfloor\sqrt{2\times n}\rfloor\) 来求出 \(k\) ,然后判断 \(k\times(k+1)\) 是否等于 \(2\times n\)。
code:
#include<bits/stdc++.h>
using namespace std;
unsigned long long n;
int main(){
cin>>n;
long long k=sqrt(2*n);求出k
if(k*(k+1)==2*n) cout<<k;
else cout<<-1;
return 0;
}

浙公网安备 33010602011771号