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

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

这题我还是不找规律了,老老实实推吧,传说找规律也可以,我还是算了

递推式:f(n)=k*f(n-1)+p

是的,你没有看错,这玩意是什么???是高中的数列求和啊,什么你没看出来,这玩意外号——一阶线性递推

等式两边同时加p/k-1   f(n)+p/(k-1) = k(f(n-1)+p/k-1);不信你可以推一下试试

那么f(n)可以通过等比数列求出f(n)=p/(k-1)*(k^(n-1))-p/(n-1);

再用分组求和那么前n项和公式为T(n)=(k^n-1)/(k-1)+p*(k^n-1)/(k-1)^2-p*n/(k-1)=(1+p/(k-1))*(k^n-1)/(k-1)-p*n/(k-1)

注意当n==1时T(n)=p*n*(n-1)/2+n;

有分数。求一下(k-1) % 1e9+7的逆元inv=pow(k-1,mod-2);

 

#include<iostream>
#include<string.h> #include<algorithm> #include<stdio.h> #define ll long long using namespace std;; const ll mod = 1e9+7; ll pow(ll a,ll b) { ll ans = 1; while(b) { if (b&1) { ans = ans*a%mod; } a = a*a%mod; b/=2; } return ans; } int main() { ios::sync_with_stdio(0); ll n,k,p; ll ans=0; while(~scanf("%lld%lld%lld",&n,&k,&p)) { if (k==1) { ans=(n*(n-1)%mod/2*p+n)%mod; printf("%lld\n",ans); } else { ll inv=pow(k-1,mod-2); ans=(1+p*inv%mod)%mod*((pow(k,n)-1+mod)%mod)%mod*inv%mod; ans=(ans-p*inv%mod*n%mod+mod)%mod; printf("%lld\n",ans); } } return 0; }

 

全部评论

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务