数列 [Bzoj3142,Codevs2089,HNOI2013]

45 篇文章 0 订阅
33 篇文章 0 订阅

题目地址——


数列


【问题描述】

小T 最近在学着买股票,他得到内部消息:F公司 的股票将会疯涨。
股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为 N
在疯涨的 K 天中 小T 观察到:
除第一天外每天的股价都比前一天高,且高出的价格(即当天的股价与前一天的股价之差)不会超过 M M 正整数。
并且这些参数满足 M(K1)<N
小T忘记了这K天每天的具体股价了,他现在想知道这 K 天的股价有多少种可能。


【输入描述】

输入文件只有一行用空格隔开的四个数:NKMP
P 的说明参见后面“输出格式”中对 P 的解释。
输入保证 20% 的数据 M,N,K,P20000 ,保证 100% 的数据 M,K,P109 N1018


【输出描述】

仅包含一个数,表示这 K 天的股价的可能种数对于 P 的模值。


【输入样例】

7 3 2 997


【输出样例】

16


【数据范围及提示 Data Size & Hint】

输出样例的16表示输入样例的股价有16种可能:
{1,2,3},{1,2,4},{1,3,4},{1,3,5},
{2,3,4},{2,3,5},{2,4,5},{2,4,6},
{3,4,5},{3,4,6},{3,5,6},{3,5,7},
{4,5,6},{4,5,7},{4,6,7},{5,6,7}。


【Solution】

ans=mk1n(k2)(mk+1+mk2) mod p
用快速幂就可以 A 了。


【Code】

[cpp]
  1. #include <iostream>  
  2. #include <cstdio>  
  3.   
  4. #define LL long long  
  5. #define Min(x,y) ((x)<(y)?(x):(y))  
  6.   
  7. using namespace std;  
  8.   
  9. LL n,k,m,p;  
  10. LL tp;  
  11.   
  12. inline LL in(){  
  13.     LL ans=0;  
  14.     char x=getchar();  
  15.     while(x<‘0’||x>‘9’)x=getchar();  
  16.     while(x>=‘0’&&x<=‘9’){ans=ans*10+x-‘0’;x=getchar();}  
  17.     return ans;  
  18. }  
  19.   
  20. LL power(LL x,LL y){  
  21.     if(y==0)return 1;  
  22.     if(y==1)return x%p;  
  23.     LL tmp=power(x,y/2);  
  24.     if(y&1)return tmp*tmp%p*(x%p)%p;  
  25.     else return tmp*tmp%p;  
  26. }  
  27.   
  28. LL power2(LL x,LL y){  
  29.     if(y==0)return 1;  
  30.     if(y==1)return x%tp;  
  31.     LL tmp=power2(x,y/2);  
  32.     if(y&1)return tmp*tmp%tp*(x%tp)%tp;  
  33.     else return tmp*tmp%tp;  
  34. }  
  35.   
  36. int main(){  
  37.       
  38.     n=in();k=in();m=in();p=in();  
  39.     tp=2*p;  
  40.       
  41.     LL t1=power(m,k-1)*(n%p)%p;  
  42.     LL t2=(k-1)%p;  
  43.     LL tmp=power2(m,k-1);  
  44.     LL t3=(tmp+tmp*m)%tp/2;  
  45.       
  46.     LL ans=((t1-t2*t3%p)%p+p)%p;  
  47.     printf(”%lld\n”,ans);  
  48.       
  49.     return 0;  
  50. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值