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;}