牛客小白月赛6 J-洋灰三角

题目:https://www.nowcoder.com/acm/contest/136/J

当n==1时,直接输出1;

当k==1时,Fn是个等差数列,求和公式直接做;

当k>=2时,下面给出我的推导过程图片;

牛客小白月赛6 J-洋灰三角_第1张图片

涉及到高数里面的求和过程,先对一个数列求导,再求和,再积分;也可以先积分,再求和,再微分;

倒数第三行就是先对原求和数列进行微分求和,再对求和结果进行积分;

赋上代码;

#include
#include
#include
using namespace std;
const int mod=1e9+7;
long long quick(long long a,int b){
    long long result=1LL;
    a%=mod;
    while(b){
        if(b&1)
            result=result%mod*(a%mod)%mod;
        a=a%mod*(a%mod)%mod;
        b>>=1;
    }
    return result;
}

int main(){
    long long n,p;
    long long k;
    scanf("%lld%lld%lld",&n,&k,&p);
    if(n==1){
        printf("%d\n",1%mod);
        return 0;
    }
    if(k==1){
        long long result=((n-1)*n/2%mod*(p%mod)%mod+n%mod)%mod;
        printf("%lld\n",result);
    }
    else{
        long long guodu=quick(k,n-1);//k的n-1次幂
        long long guoduadd1=guodu*(k%mod)%mod;//k的n次幂
        long long niyuan=quick(k-1,mod-2);//k-1的逆元
        long long niyuan2=quick((k-1)*(k-1),mod-2);//(k-1)(k-1)的逆元
        long long result=0LL;
        result=(result%mod+(guoduadd1-1+mod)%mod*(niyuan%mod)%mod)%mod;
        result=(result%mod+n%mod*(p%mod)%mod*((guodu-1+mod)%mod)%mod*(niyuan%mod)%mod)%mod;
        result=(result%mod+((n%mod*(guodu%mod)%mod-(n-1)%mod*(guoduadd1%mod)%mod+mod)%mod-1+mod)%mod*(p%mod)%mod*niyuan2%mod)%mod;
        printf("%lld\n",result);
    }
    return 0;
}

上面的求和最后还可以化简,可以自己化;

转载请注明

你可能感兴趣的:(牛客网小白赛,ACM,牛客网小白赛)