码迷,mamicode.com
首页 > Web开发 > 详细

vijos1955:JSOI2012 分零食

时间:2015-12-22 22:49:50      阅读:316      评论:0      收藏:0      [点我收藏+]

标签:

描述

这里是欢乐的进香河,这里是欢乐的幼儿园。

今天是2月14日,星期二。在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着。校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们。听到这个消息,所有同学都安安静静地排好了队,大家都知道,校长不喜欢调皮的孩子。

同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U。如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是f(x)=Ox^2+Sx+U。

现在校长开始分糖果了,一共有M个糖果。有些小朋友可能得不到糖果,对于那些得不到糖果的小朋友来说,欢乐程度就是1。如果一位小朋友得不到糖果,那么在她身后的小朋友们也都得不到糖果。(即这一列得不到糖果的小朋友一定是最后的连续若干位)

所有分糖果的方案都是等概率的。现在问题是:期望情况下,所有小朋友的欢乐程度的乘积是多少?呆呆同学很快就有了一个思路,只要知道总的方案个数T和所有方案下欢乐程度乘积的总和S,就可以得到答案Ans=S/T。现在他已经求出来了T的答案,但是S怎么求呢?他就不知道了。你能告诉他么?

因为答案很大,你只需要告诉他S对P取模后的结果。

后记:

虽然大家都知道,即便知道了T,知道了S对P取模后的结果,也没有办法知道期望情况下,所有小朋友欢乐程度的乘积。但是,当呆呆想到这一点的时候,已经彻底绝望了。

格式

输入格式

第一行有2个整数,分别是M和P。

第二行有一个整数A,第三行有一个整数O。

第四行有一个整数S,第五行有一个整数U。

输出格式

一个整数S,因为答案可能很大,你只需要输出S 对P取模后的结果。

样例1

样例输入1

4 100
4
1
0
0

样例输出1

63

限制

对于40%的数据,M<=150。

对于60%的数据,M<=2000。

对于80%的数据,M<=6000。

对于100%的数据,M<=10000,P<=255,A<=10^8,O<=4,S<=300,U<=100。

 

技术分享

恶心之极的题目……只能手推一个非常可怕的dp转移方程……详细内容看代码吧

 

#include<cstdio>
using namespace std;

int n,m,a,b,c,p;
int rec[10001][10001],ans=0;
inline int f(int x){
    return ((a*x*x)%p+(b*x)+c)%p;
}
int main(){
    scanf("%d %d %d %d %d %d",&m,&p,&n,&a,&b,&c);
    if (n>m) n=m;
    for (register int i=1,j=1;i<=m;i++,j++,j-=j>=p?p:0) 
    if (i>p) rec[1][i]=rec[1][(j==0?p-1:j-1)+1];else rec[1][i]=f(j);
    int k=((rec[1][2]-3*rec[1][1])%p+3*p)%p,y=(2*a-rec[1][2]+2*rec[1][1]+100*p)%p;
    ans=rec[1][m];
    for (register int i=2;i<=n;i++){
        rec[i][i]=(rec[i-1][i-1]*rec[1][1])%p;
        int d=rec[i][i];
        for (register int j=i+1;j<=m;j++){
            d+=((y*rec[i-1][j-3])+(k*rec[i-1][j-2])+(rec[1][1]*rec[i-1][j-1]))%p;
            rec[i][j]=(2*rec[i][j-1]-rec[i][j-2]+d+3*p)%p;
        }
        ans+=rec[i][m];
    }
    printf("%d\n",ans%p);
}

 

vijos1955:JSOI2012 分零食

标签:

原文地址:http://www.cnblogs.com/Enceladus/p/5068188.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!