题解: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;
}
posted @ 2024-08-20 16:45  Laoda_Bryant  阅读(11)  评论(0)    收藏  举报