題目
https://www.luogu.org/problem/U92904?contestId=23574
解題思路
我們可以二分一個最大正方形的邊長,然後不斷用剩下的邊長填補正方形,第一次補,第補。
代碼
#include<cmath>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll T,m;
int main(){
scanf("%lld",&T);
while(T--){
scanf("%lld",&m);
ll l=1,r=sqrt(m),w=0;
while(l<r){
ll mid=(l+r)/2;
if (m-(mid+1)*mid*2>=0) l=mid+1; else r=mid;
}
ll g=(l-1);
m-=(g+1)*g*2; w=g*g;
while (m>=2&&w>=1){
if (m>=3) m-=3,w++; else break;
if (m>=2) w+=min(g-1,m/2),m-=min(2*g-2,m);
}
printf("%lld\n",w);
}
}