題意:任何一個數可以表示為連續整數相加,問這些連續整數的最大長度
題解:假設左右是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; }
?