1.B. Brightness Begins
思路
要求最后的灯泡打开的数量,由于一开始灯泡是打开的,如果最后还需要打开,那么操作数量一定是偶数,移目至操作前提,需要灯泡的序号能整除 \(x\),由于遍历1~x,推出最后灯泡 \(i\) 亮的条件是:\(1~i\) 中有偶数个\(i\)的因数,即 \(i\) 有偶数个因数,反之即有奇数个因数,由于因数成对存在,只有当这个数是完全平方数的时候才会有奇数个因数,所以题目转化为: \(n\) 以内至少有 \(k\) 个非完全平方数。
正难则反,我们只需反求:\(n\) 以内至少有 \(n-k\) 个非完全平方数。第 \(n-k\) 个非完全平方数即 \((n-k)^2\) ,可得方程:\(n<=(n-k)^2\) ,变形得:
\(f(n)=n-\sqrt{n}>=k\),
由于 \(f(n)\) 单调递增,所以问题变成了:找到最小的 \(n\) ,使得 \(f(n)>=k\) 成立,二分即可;
注意:使用sqrtl代替sqrt,精度需求高;
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define pb push_back
#define bs bitset
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
ll k;
void solve(){
cin>>k;
ll l=1;ll r=2e18;
while(l<r){
ll mid=(l+r)>>1;
if(mid-(int)sqrtl(mid)>=k)r=mid;
else l=mid+1;
//cout<<l<<" "<<r<<" "<<mid<<" "<<mid-sqrt(mid)<<endl;
}
cout<<l<<endl;
}
int main()
{
fast();
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
标签:typedef,ll,练习,因数,24.10,mid,算法,灯泡,define
From: https://www.cnblogs.com/oaths/p/18448307