最早的想法是推公式
愣是没推出来
菜逼只能暴力前缀和加二分
前缀和不用算完
由题意算到一半多点就可以了
二分的时候要注意边界
#include <iostream>
using namespace std;
const int MAXN = 2e6 + 10;
typedef long long ll;
ll arr[MAXN];
int bsearch(int head, int tail, ll x)
{
int fst = 0, lst = tail, mid;
while(fst <= lst)
{
mid = (fst + lst) / 2;
if(arr[mid] > x)
lst = mid - 1;
else if(arr[mid] < x)
fst = mid + 1;
else
return mid;
}
return -1;
}
int main()
{
ll len;
cin>>len;
for(int i = 1; i <= len / 2 + len / 4; i++)
{
arr[i] = arr[i - 1] + i;
//cout<<arr[i]<<' ';
}
int tmp;
for(int i = 1; i <= len / 2 + len / 6; i++)
{
tmp = bsearch(i, len / 2 + len / 4, arr[i] + len);
if(tmp != -1)
cout<<i + 1<<' '<<tmp<<endl;
}
return 0;
}