• 3142:[HNOI2013]数列


    题目描述 Description
    小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨。
    股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N。在疯涨的K天中小T观察到:除第一天外每天的股价都比前一天高,且高出的价格(即当天的股价与前一天的股价之差)不会超过M,M为正整数。并且这些参数满足M(K-1)
    小T忘记了这K天每天的具体股价了,他现在想知道这K天的股价有多少种可能。
    输入描述 Input Description
    输入文件只有一行用空格隔开的四个数:N、K、M、P。对P的说明参见后面“输出格式”中对P的解释。
    输入保证20%的数据M,N,K,P≤20000,保证100%的数据M,K,P≤109,N≤1018。
    输出描述 Output Description
    仅包含一个数,表示这 K 天的股价的可能种数对于 P 的模值。
    样例输入 Sample Input
    7 3 2 997
    样例输出 Sample Output
    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}。

    看了题解,原来这道题这么简单,考试的时候我在干嘛啊(我记得推了半天推出了一个错误的公式)
    我们可以枚举每两天的差值,对于每一个差值序列a[1],a[2],...,a[k-1]
    有N-a[1]-a[2]-...-a[k-1]种方法,然后求和
    因为N>M(K-1),所以一共有M^(K-1)个不同的序列
    ans加上一个N*M^(K-1),再考虑减法的部分
    M^(K-1)个数列一共有M^(K-1)*(K-1)个数字,1到M出现次数是一样的,为M^(K-2)*(K-1)
    所以ans减去M^(K-1)*(K-1)*(M+1)/2
    ans=N*M^(K-1)-M^(K-1)*(K-1)*(M+1)/2
    剩下的就是乱搞了....

     1 var
     2     n,k,m,p,x:int64;
     3 
     4 function f(x,y:int64):int64;
     5 begin
     6     if y=0 then exit(1);
     7     f:=f(x,y>>1);
     8     f:=f*f mod p;
     9     if y and 1=1 then f:=f*x mod p;
    10 end;
    11 
    12 begin
    13     read(n,k,m,p);
    14     x:=((m mod p)*(n mod p)-(m*(m+1)>>1 mod p)*(k-1))mod p;
    15     if x<0 then x:=x+trunc(abs(x)/p)*p+p;
    16     x:=x mod p;
    17     writeln(f(m,k-2)*x mod p);
    18 end.
    View Code
  • 相关阅读:
    机器学习分类
    12.python中高阶函数以及内建函数(map,filter,sorted),和闭包
    python中的异常处理相关语句和迭代器
    和好朋友渐行渐远是什么感觉?
    MDX学习笔记(整理) MDX语法
    Cognos软件介绍文档(原创)
    隐藏
    android::Mutex::Autolock的使用
    Android中sp和wp的使用
    Day 07 字符编码,文件操作
  • 原文地址:https://www.cnblogs.com/Randolph87/p/3582401.html
Copyright © 2020-2023  润新知