zoukankan      html  css  js  c++  java
  • bzoj4332;vijos1955:JSOI2012 分零食

    描述

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

    今天是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>
    #define rec(x,y) rec[aa[y]+x]
    using namespace std;
    
    int n,m,a,b,c,p,l1,l2,l3,l0;
    int rec[50000001],ans=0,aa[10001],f[255];
    int main(){
        scanf("%d%d%d%d%d%d",&m,&p,&n,&a,&b,&c);
        register int i,j;
        if (n>m) n=m;
        aa[1]=0;
        a%=p;b%=p;c%=p;
        f[0]=c;
        for (i=1;i<p;i++){
            f[i]=f[i-1]+a*(2*i-1)+b;
            while (f[i]>=p) f[i]-=p;
        }
        for (i=2;i<=m;i++) aa[i]=aa[i-1]+i-1;
        for (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))+3*p)%p,y=(2*a-rec(1,2)+2*rec(1,1)+100*p)%p;
        ans=rec(1,m);
        for (i=2;i<=n;i++){
            rec(i,i)=(rec(i-1,i-1)*f[1])%p;
            int d=rec(i,i);
            j=i+1;
            d+=((k*rec(i-1,j-2))+(f[1]*rec(i-1,j-1)));
            rec(i,j)=(2*rec(i,j-1)+d+p)%p;
            j++;
            l0=aa[j]+i;l1=aa[j-1]+i-1;l2=aa[j-2]+i-1;l3=aa[j-3]+i-1;
            for (;j<=m;j++){
                d+=((y*rec[l3])+(k*rec[l2])+(f[1]*rec[l1]));
                rec[l0]=(2*rec[l1+1]-rec[l2+1]+d+p)%p;
                l0+=j;l1+=j-1;l2+=j-2;l3+=j-3;
            }
            ans+=rec(i,m);
        }
        printf("%d
    ",ans%p);
    }

    UPD at 2017.4.8

    原来我这样是暴力水过,有空再写写正解

  • 相关阅读:
    不同浏览器对于textarea中换行符的处理
    apache 页面压缩技术mod_deflate安装和配置
    php5+Apache2+mysql+Eclipse debug完全配置
    php程序的国际化(转载)
    PHP加载mysql DDL会失败
    mysql绿色版注册服务
    DEDE利用自由列表创建全站RSS订阅内容更新整站.xml文档
    PHP模拟多线程请求
    在Mac OS X中配置Apache + PHP + MySQL(转)
    ThinkPHP框架项目开发专题自动验证
  • 原文地址:https://www.cnblogs.com/Enceladus/p/5068188.html
Copyright © 2011-2022 走看看