前言:
开考一个半小时一直以为自己做错题了
要是noip都是这种难度,那我可以滚回去学文化课了
T2
【题目描述】
辣鸡ljh NOI之后就退役了,然后就滚去学文化课了。
他每天都被katarina大神虐,仗着自己学过一些姿势就给katarina大神出了一道题。
有一棵 n 个节点的以 1 号节点为根的树,每个节点上有一个小桶,节点u上的小桶可以容纳ki个小球,
ljh每次可以给一个节点到根路径上的所有节点的小桶内放一个小球,如果这个节点的小桶满了则不能放进这个节点,在放完所有小球之后就企图去刁难katarina大神,让katarina大神回答每个节点的小桶内的小球有多少种颜色。
然而katarina大神一眼就秒掉了,还说这就是一道傻逼模板题。
现在katarina大神想考考即将参加NOIP2017的你能不能回答上辣鸡ljh的问题。
【输入格式】
第一行,一个整数n,树上节点的数量。
接下来n − 1行,每行两个整数u, v,表示在u, v之间有一条边。
接下来一行n个整数,表示每个节点上的小桶数量。
下一行是一个整数m,表示ljh进行的操作数量。
接下来m行,每行两个整数x, c,分别表示进行操作的节点和小球颜色。
下一行是一个整数Q,表示你需要回答的询问数。
接下来Q行,每行一个整数x,表示一个询问。
【输出格式】
对于每个询问输出一行表示这个询问的答案
【样例1 输入】
5
1 2
2 3
3 4
2 5
2 1 1 1 1
2
2 1
4 2
3
1
3
5
【样例1 输出】
2
1
0
【样例2 输入】
10
3 10
2 5
3 2
2 6
1 9
8 7
7 4
3 8
3 1
15 47 23 22 9 16 45 39 21 13
10
10 7
9 3
5 1
5 2
9 4
10 9
2 4
10 1
2 6
7 9
3
1
2
3
【样例2 输出】
7
4
6
分析:
看到题解之后,我真的觉得出题人是口胡的
T3
【题目描述】
辣鸡ljh NOI之后就退役了,然后就滚去学文化课了。
他发现katarina大佬真是太强了,于是就学习了一下katarina大佬的做题方法。
比如这是一本有n道题的练习册,katarina大佬每天都会做k道题。
第一天做第1~k题,第二天做第2~k + 1题……第n − k + 1天做第n − k + 1~n道题。
但是辣鸡 ljh 又不想太累,所以他想知道katarina大佬做完这本练习册的劳累度。
每道题有它的难度值,假设今天katarina大佬做的题目中最大难度为t,那么今天katarina大佬的劳累
度就是wt୲,做完这本书的劳累值就是每天的劳累值之和。
但是辣鸡ljh一道题都不会,自然也不知道题目有多难,他只知道题目的难度一定在1~m之间随机。
他想让即将参加 NOIP 的你帮他算算katarina大佬做完这本书的劳累值期望
【输入格式】
第一行,三个整数n,m, k
第二行,m个整数表示wt
【输出格式】
输出劳累值期望对1000000007取模的值。
【样例1 输入】
2 2 2
1 2
【样例1 输出】
750000007
【样例 1 解释】
有{1,1}, {1,2}, {2,1}, {2,2}四种可能,期望为7/4
【样例 2 输入】
5 4 3
2 1 3 5
【样例2 输出】
890625018
分析:
这算是这套题中思维较高,比较有价值的一道题了
题解的做法我不是特别理解
好在ZYXZYXZYX和cyf给出很好的做法,详细说一下:
1st . %%% ZYXZYXZYX && zhhe:
题目的难度就在如何计算这个区间最大值上
既然计算起来困难,那我们就直接枚举
假设我们现在已经知道了长度为k的区间的最大值是i
我们现在要构造一个合法区间
显然,这个区间内不能出现大于i的值,所以我们直接从(1~i)中选数填满这个区间
i^k
但是这些情况中包含不含有i的情况,所以我们要减掉不包含i的情况:
正确的方案数:i^k-(i-1)^k
那么这些区间的贡献一定是W[i]
期望的简单计算公式:
所有情况的和 / 情况总数
所以我们有了下面这个式子:
这就是答案了
Q.整个序列中各个区间不是互相影响的吗,可以直接乘上区间数量吗
A. by zys学长
如果区间之间的贡献是相加的关系
如()+()+()… ,那么区间之间是互不影响的
但是如果区间之间的贡献是相乘,就不能这样算了
1st . %%%cyf
当然,如果你觉得上面的那个很玄学,
那么下面说一个中规中矩的做法:
实际上两种做法是一样的
//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
const ll mod=1000000007;
int W[105],n,m,k;
ll hw[500];
ll KSM(ll a,ll b)
{
ll t=1;
a%=mod;
while (b)
{
if (b&1)
t=(t*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return t%mod;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=m;i++) scanf("%d",&W[i]);
for (int i=1;i<=m;i++) hw[i]=KSM(i,k); //hw[0]=0
ll inv=KSM(KSM(m,k),mod-2);
ll ans=0;
for (int i=1;i<=m;i++)
ans=(ans+W[i]*1LL*(hw[i]-hw[i-1])%mod)%mod;
ans=(ans*(n-k+1)%mod)%mod;
ans=(ans*inv)%mod;
printf("%lld\n",ans);
return 0;
}