[Lydsy2017省队十连测]商店购物

SOL:

我们可以前面写背包,后面组合数。

#include<bits/stdc++.h>
#pragma GCC optimize("-O2")
#define mo 1000000007
#define N 10000007
#define LL long long
using namespace std;
#define sight(x) (‘0‘<=x&&x<=‘9‘)
inline void read(LL &x){
    static char c;
    for (c=getchar();!sight(c);c=getchar());
    for (x=0;sight(c);c=getchar())x=x*10+c-48;
}
void write(int x){if (x<10) {putchar(‘0‘+x); return;} write(x/10); putchar(‘0‘+x%10);}
inline void writeln(int x){ if (x<0) putchar(‘-‘),x*=-1; write(x); putchar(‘\n‘); }
inline void writel(int x){ if (x<0) putchar(‘-‘),x*=-1; write(x); putchar(‘ ‘); }
LL fac[N],sum[N],f[N],n,m,k,last,x,ans;
inline LL qsm(LL x,LL y=mo-2) {
    static LL anw;
    for (anw=1,x%=mo;y;y>>=1,x=x*x%mo)
     if (y&1) anw=anw*x%mo;
    return anw;
}
inline LL C(LL x,LL y) {
    if (y==0) return 1;
    x+=y; y--;
    return fac[x-1]*qsm(fac[y])%mo*qsm(fac[x-y-1])%mo;
}
signed main () {
//  freopen("a.in","r",stdin);
    read(m); read(n); read(k);
    fac[0]=1;
    for (int i=1;i<N;i++) fac[i]=fac[i-1]*i%mo;
    for (int i=0;i<=5007;i++) sum[i]=1;
    for (int t=1;t<=n;t++) {
        read(x);
        last+=x;
        for (int i=0;i<=last;i++)
            f[i]=sum[i]-(i>x?sum[i-x-1]:0),f[i]%=mo,f[i]=(f[i]+mo)%mo;
        sum[0]=f[0];
        for (int i=1;i<=last+307;i++) sum[i]=sum[i-1]+f[i],sum[i]%=mo;
    }
    if (m!=n)
    for (int i=0;i<=min(last,k);i++)
     ans=ans+f[i]*C(k-i,m-n)%mo,ans%=mo;
     else ans=f[min(last,k)];
    writeln(ans); return 0;
}

原文地址:https://www.cnblogs.com/rrsb/p/9126893.html

时间: 2024-10-12 07:56:14

[Lydsy2017省队十连测]商店购物的相关文章

[Lydsy2017省队十连测]最长路径

SOL: 同JZOJ5061 #include<bits/stdc++.h> #define LL long long #define N 3007 using namespace std; LL n,mo,c[N][N],f[N],g[N],anw[N]; inline LL qsm(LL x,LL y) { static LL anw; for (anw=1;y;y=y>>1,x=x*x%mo) if (y&1) anw=anw*x%mo; return anw; }

[BZOJ]2017省队十连测推广赛1

听学长说有比赛就随便打一打. A.普通计算姬 题目大意:给出一棵带权树,支持一下两种操作:1.修改一个点的权值:2.给出l,r,询问以点l为根的子树和.点l+1为根的子树和.点l+2为根的子树和--点r为根的子树和的总和.(点数.操作数不超过10^5) 思路:感觉是三题中最难的.给出的[l,r]区间在树上没有实际意义,不好利用数据结构维护.考虑若不修改,可以一遍dfs算出每个点对应的dfs序,这样每棵子树都对应一个dfs序的区间,前缀和一下就能O(1)查子树和,再按点的编号顺序把子树和前缀和一下

bzoj [ 2017省队十连测推广赛1 ] ( 4765 &amp;&amp; 4766 &amp;&amp; 4767 )题解

bzoj 4765 -- 分块+dfs序+树状数组: 考虑分块.将1~n分成sqrt(n)块,对每个点记录它在每个块中的祖先个数,修改一个点时枚举每一块修改. 查询[l,r]时如果一个块在[l,r]中,直接将其加入答案.显然只剩下O(sqrt(n))个点.求出树的dfs序,用树状数组维护就可以O(logn)求出答案. 时间复杂度O(n*sqrt(n)*logn) 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cs

2015年最新国内十大应用商店广告报价表

说明:国内十大安卓商店市场刊例根据网络资源收集而成,实际情况可能有稍微的变动,请大家参考.一般根据手机客户端的展示区分为轮播图.热门.随机推荐.分类推荐.相关应用(用户还下载了XXX)等广告位,大家可以根据字面意思来理解,具体投放过程中,可以和相关负责人进行确认和联系.同时,在广告的投放中,分为周末.月初月末和工作日,周末一般指周六周日,工作日一般为周一到周五. 一.360手机助手刊例表 a)PC首页一屏-焦点大图PC-01焦点图3.5万/天 b)PC首页-今日最热软件PC-02推荐位2.9万/

洛谷P2732 商店购物 Shopping Offers

P2732 商店购物 Shopping Offers 23通过 41提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 在商店中,每一种商品都有一个价格(用整数表示).例如,一朵花的价格是 2 zorkmids (z),而一个花瓶的价格是 5z .为了吸引更多的顾客,商店举行了促销活动. 题目描述 促销活动把一个或多个商品组合起来降价销售,例如: 三朵花的价格是 5z 而不是 6z, 两个花瓶和一朵花的价格是 10z 而不是

shell脚本(2)商店购物

商店购物 1.2.3. 原文地址:http://blog.51cto.com/13813317/2151925

商店购物 (shopping.c/cpp/pas)

1.商店购物 (shopping.c/cpp/pas) 在滨海市开着 n 家商店,编号依次为 1 到 n,其中编号为 1 到 m 的商店有日消费量上 限,第 i 家商店的日消费量上限为 wi. 海霸王每次购物的过程是这样的:依次经过每家商店,然后购买非负整数价格的商品,并 在结账的时候在账本上写上在这家商店消费了多少钱.当然,他在这家商店也可以什么都不 买,然后在账本上写上一个 “0”. 这一天,海霸王日常完成了一次购物,但是他不慎遗失了他的账本.他只记得自己这一 天一共消费了多少钱,请写一个程

Noi2016十连测第二场-黑暗 (二项式定理/斯特林数+CDQ+NTT)

Noi2016十连测第二场-黑暗 (二项式定理/斯特林数+CDQ+NTT) 题意: n 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 m 次方,求所有可能的图的权值和. 考虑\(dp[i][j]\)表示\(j\)个点,权值为\(i\)次方 我们首先要预处理出\(n\)个点无向联通图的数量\(g[i]\),模板题:BZOJ-3456 题解 对于\(dp[i][j]\),枚举\(1\)号点所在的连通块大小为\(x\),那么可以得到的是\(dp[i][j]=\sum dp[k][j-x]

noip2016十连测题解

以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #include <string.h> #include <time.h> #include <stdlib.h> #include <string> #include <bitset> #include <vector> #include <