• 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
  • 相关阅读:
    并不对劲的字符串专题(二):kmp
    54.Counting Bits( 计算1的个数)
    53.Coin Change(找硬币)
    52.Product of Array Except Self(除过自身的数组乘积)
    51.Lowest Common Ancestor of a Binary Tree(二叉树的最小公共祖先)
    50.Maximal Square(最大正方形)
    49.Kth Largest Element in an Array
    48.Course Schedule(课程安排)
    47.Number of Islands(岛的数量)
    46.Maximum Product Subarray(最大乘积子数组)
  • 原文地址:https://www.cnblogs.com/Randolph87/p/3582401.html
Copyright © 2020-2023  润新知