博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】3142: [Hnoi2013]数列
阅读量:5047 次
发布时间:2019-06-12

本文共 1213 字,大约阅读时间需要 4 分钟。

题目链接:


 

年也有一个组合数学。。。(这几年的画风啊....

 

考虑直接去做:DP? DP+容斥? 。。。。NAIVE!

 

设${a[i]}$表示第${i}$和第${i-1}$天股价差值。

那么对于任意一个可能$a$数组,它对答案的贡献为:${n-\sum a[i]}$

 

${ANS=数组A的个数*n-\sum a[i]}$

 

考虑这样的$a$数组可能有多少个?应该是:${m^{k-1}}$个,这样就计算完了减号左边。

 

考虑计算减号右边,其实相当于所有$a$数组中一共有${m^{k-1}*(k-1)}$个数字。

每一个${a[i]\in[1,m]}$,值域范围内的数字出现次数也应该一样。

每一个在${[l,r]}$的数字就出现了${m^{k-1}*(k-2)}$次。

在套一个等差数列求和公式${m^{k-1}*(k-2)*m(m+1)/2}$

 

最终:

$${ANS=n*m^{k-1}-m^{k-2}*(k-1)*m(m+1)/2}$$

 

套一个快速幂即可。

 


 

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 using namespace std; 9 #define maxn 1001010 #define llg long long 11 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);12 llg n,m,k,p,ans;13 14 llg ksm(llg a,llg b,llg md)15 {16 if (b==0) return 1;17 llg mi=1;18 a%=md;19 while (b!=0)20 {21 if (b&1) mi*=a,mi%=md;22 a*=a; 23 a%=md;24 b/=2;25 }26 return mi;27 }28 29 int main()30 {31 yyj("math");32 cin>>n>>k>>m>>p;33 n%=p;34 ans=ksm(m,k-1,p)*(n % p);35 ans%=p;36 ans-=((ksm(m,k-2,p)*(k-1)) % p)*(((m*m+m)/2) % p);37 ans%=p;38 while (ans<0) ans+=p;39 cout<

 

转载于:https://www.cnblogs.com/Dragon-Light/p/6407736.html

你可能感兴趣的文章
在ns2.35中添加myevalvid框架
查看>>
【贪心+DFS】D. Field expansion
查看>>
为什么要使用href=”javascript:void(0);”
查看>>
二进制文件的查看和编辑
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
javascript学习---BOM
查看>>
IOS-每个程序员的编程之路上都应该看这11本书
查看>>
自定义tabbar(纯代码)
查看>>
extjs fieldset 和 radio
查看>>
小程序底部导航栏
查看>>
Codeforces Gym101505G:Orchard Division(扫描线+线段树第k大)
查看>>
ibatis学习笔记
查看>>
18-ES6(1)
查看>>
poj1611 简单并查集
查看>>
tensorflow实现迁移学习
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
关于Redis处理高并发
查看>>