D - Staircase Sequences 题解(思维)

题目链接

题目大意

求有多少个连续的数相加等于n

\(1<=n<=1e12\)

题目思路

定义sum[l,r]=l+(l+1)+.....(r-1)+r

首先假设所有连续的数都是正数,那么为sum[l,r]=n,那么显然sum[-l+1,r]=n

然后直接枚举长度len,那么sum[1,len]可以求出来

就是 1到 len求和以后 每往后移一位就是加 len 所以只要用 n剪掉sum[1,len] 看能不能被len整除就行了

代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e2+5,inf=0x3f3f3f3f,mod=998244353;
const int eps=1e-6;
ll n,ans;
signed main(){
    scanf("%lld",&n);
    for(ll i=1;i<=1e7;i++){
        ll sum=(1+i)*i/2;
        if(sum>n) break;
        if((n-sum)%i==0) ans+=2;
    }
    printf("%lld\n",ans);
    return 0;
}

posted @ 2021-01-31 15:00  hunxuewangzi  阅读(133)  评论(0编辑  收藏  举报