题意:任何一个数可以表示为连续整数相加,问这些连续整数的最大长度
题解:假设左右是l,r,那么(l+r)*(l-r+1)/2就是这段序列的和,枚举2n的所有因子,找到最大的就可以了
我的做法是预处理前缀和,二分找到答案位置然后暴力 。。
#include <bits/stdc++.h> #define ll long long #define maxn 100100 using namespace std; ll a[maxn]; int main(){ll T,n;cin>>T;for(ll i=1;i<=100010;i++) a[i] = i*(i+1)/2;while(T--){cin>>n;ll l=0,r=100001,ans=-1,mid;while(l<=r){mid = (l+r)>>1;if(a[mid]<=n) ans = mid,l = mid+1;else r = mid-1;}if(a[ans] == n) cout<<ans<<endl;else{for(ll i=ans;i>=1;i--){if((n-a[i])%i == 0){cout<<i<<endl;break;}}}}return 0; }