luogu Tweetuzki 愛等差數列
阿新 • • 發佈:2019-01-10
由等差數列求和公式易得: , 而a1為正整數,因此2s>n(n-1),因此2s>(n-1)(n-1),所以n-1一定小於,即n一定小於,我們只需倒著列舉n, 找到第一個滿足使a1為正整數的n就可以,因為我們是倒著列舉的,所以第一個肯定滿足使a1最小,a1+n-1就是末項
#include<iostream> #include<cstdio> #include<cmath> #define ll long long using namespace std; ll k; ll read() { ll f=1,x=0; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+ch-'0'; ch=getchar(); } return x*f; } void write(ll x) { if(x>9) write(x/10); putchar(x%10+'0'); } ll ans; ll a; int main() { k=read(); ll num=2*k; ll maxx=sqrt(num)+1; for(ll i=maxx;i>=1;i--) { if((num-i*i+i)%(2*i)==0&&(num-i*i+i)>0)//列舉n { ans=i; break; } } a=(num-ans*ans+ans)/(2*ans); write(a); putchar(' '); write(a+ans-1); return 0; }