vijosP1903学姐的实习工资

描述

学姐去实习了, 一共实习了N天, 每一天都可以得到实习工资V[i], 这里V[1..N]被看作是整数序列.
因为学姐很厉害, 所以V[1..N]是不下降的.
也就是说学姐每天的工资只会越来越多, 不会变少.
然而遗憾的是, 偷懒的学姐只记下来了其中M天的收入.
第A[1]天获得了的工资为B[1].
第A[2]天获得了的工资为B[2].
第A[3]天获得了的工资为B[3].
...
第A[M]天获得了的工资为B[M].
其中A[]是递增的.
好在她记下来了第一天和第N天的收入. 也就是说A[1]=1, A[M]=N.
现在实习结束了, 学姐看着仅有的M天的记录, 希望知道:
(1)工资序列V[1..N]有多少种可能情况, 满足已知的M条记录. 答案mod 1000000009.
(2)平均来说(考虑所有可能的情况), N天中一共得到了多少工资, 答案四舍五入到小数点后第三位.
如果doc不能回答学姐的这两个问题, 学姐会生气的!

格式

输入格式

输入数据第一行给定T, 表示总的询问次数.
对于每一次询问, 第一行给出两个整数N和M.
第二行给出M个整数, 分别为A[1]到A[M].
第三行给出M个整数, 分别为B[1]到B[M].

输出格式

对于每一次询问, 首先输出询问的编号, 参见样例输出.
之后输出问题1和问题2的答案, 用空格隔开, 详细请参见样例输出.

样例1

样例输入1[复制]

2
6 5
1 2 3 5 6
3 5 10 20 20
6 6
1 2 3 4 5 6
3 5 10 15 20 20

样例输出1[复制]

Case #1: 11 73.000
Case #2: 1 73.000

限制

对于30%的数据:
N <= 100.

对于60%的数据:
N <= 50000.

对于100%的数据:
2 <= N <= 1000000.
M <= 1000.
T <= 10.
1 = A[1] < A[2] < ... < A[M] = N.
0 <= B[1] <= B[2] <= ... <= B[M] <= 1000000.

题解:

终于填了这个坑。。。

其实考场上因为没时间所以打了暴力,大概因为乘法溢出爆零了。。。然后发现需要预处理n!以及n!的逆元,这不是很随意吗。。。

第一问用插板法算一下组合数,第二问我们可以认为b[i]到b[i+1]这里面的每个数被选到的概率都是相等的,然后期望就是(b[i]+b[i+1])/2

然后注意乘法溢出就可以了(乘法溢出居然WA0了4次T_T)

代码:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<iostream>
 7 #include<vector>
 8 #include<map>
 9 #include<set>
10 #include<queue>
11 #include<string>
12 #define inf 1000000000
13 #define maxn 2000000+5
14 #define maxm 500+100
15 #define eps 1e-10
16 #define ll long long
17 #define pa pair<int,int>
18 #define for0(i,n) for(int i=0;i<=(n);i++)
19 #define for1(i,n) for(int i=1;i<=(n);i++)
20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
22 #define mod 1000000009
23 using namespace std;
24 inline int read()
25 {
26     int x=0,f=1;char ch=getchar();
27     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
28     while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}
29     return x*f;
30 }
31 ll fac[maxn+1],inv[2][maxn+1];
32 bool v[maxn+1];
33 int p[maxn+1],tot,a[maxn],b[maxn];
34 int main()
35 {
36     freopen("input.txt","r",stdin);
37     freopen("output.txt","w",stdout);
38     for2(i,2,maxn)
39     {
40         if(!v[i])p[++tot]=i;
41         for1(j,tot)
42         {
43             int k=i*p[j];
44             if(k>maxn)break;
45             v[k]=1;
46             if(i%p[j]==0)break;
47         }
48     }
49     inv[0][0]=inv[0][1]=1;
50     for2(i,2,maxn)inv[0][i]=(ll)(mod/i+1)*inv[0][i-mod%i]%mod;
51     fac[1]=inv[1][1]=1;
52     for2(i,2,maxn)
53     {
54         fac[i]=fac[i-1]*(ll)i%mod;
55         inv[1][i]=inv[1][i-1]*inv[0][i]%mod;
56     }
57     //for1(i,100)cout<<i<<‘ ‘<<fac[i]<<‘ ‘<<inv[0][i]<<‘ ‘<<inv[1][i]<<endl;
58     int cs=read(),t=0;
59     while(cs--)
60     {
61         int n=read(),m=read();ll ans=1;
62         for1(i,m)a[i]=read();
63         for1(i,m)b[i]=read();
64         for1(i,m-1)if(a[i]+1!=a[i+1])
65         {
66             int x=b[i+1]-b[i],y=a[i+1]-a[i]-1+b[i+1]-b[i]+1-1;
67             (ans*=fac[y]*inv[1][x]%mod*inv[1][y-x]%mod)%=mod;
68             //cout<<i<<‘ ‘<<ans<<endl;
69         }
70         double sum=b[m];
71         for1(i,m-1)
72         {
73             sum+=b[i];//cout<<sum<<endl;
74             if(a[i]+1!=a[i+1])sum+=(double)(a[i+1]-a[i]-1)*(double)(b[i+1]+b[i])/2;
75         }
76         printf("Case #%d: %lld %.3lf\n",++t,ans,sum);
77     }
78     return 0;
79 } 

时间: 2024-10-08 05:21:31

vijosP1903学姐的实习工资的相关文章

2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字

美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运算(模二意义下0.1互换,注意前导0也要交换),然后在任意相邻的两个数之间插入二进制与.二进制或,或者二进制异或.现在他想知道这样计算完产生的最美妙的数字是多少. 一共T组数据.对于每组数据,第一行一个n,表示这组数据中一串数有多少个.下面n个非负整数,表示这串数. 样例输入 2 2 3 6 3 1

Vijos1901 学姐的钱包

描述 学姐每次出门逛街都要带恰好M元钱, 不过她今天却忘记带钱包了.可怜的doc只好自己凑钱给学姐, 但是他口袋里只有一元钱.好在doc的N位朋友们都特别有钱, 他们答应与doc作一些交换.其中第i位朋友说:如果doc有不少于Ri元钱,doc可以把手上所有的钱都给这位朋友,并从这位朋友手中换回Vi元钱,但是这次交换会浪费Ti的时间.doc希望可以在最短的时间内换到M元钱(其实是可以大于M的, 因为doc可以存私房钱呢), 否则学姐会生气的! 格式 输入格式 输入数据第一行给定T, 表示总的询问次

卿学姐与魔法(优先队列)

个人心得:思路很简单,不过就是会超时,而且直接用数组的话肯定不够大. 所以就用优先队列,让里面只装N个数就好了,然后再次添加时进行比较,比他小就放进去. 不过这样超时,所以先将A,B排序,然后只要比队首大就break就可以过了. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<queue> 6 #include<

A - 卿学姐与公主(线段树+单点更新+区间极值)

A - 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了高山,跨过了大洋,卿学姐来到了魔王的第一道城关. 在这个城关面前的是魔王的精锐部队,这些士兵

qwb与学姐 (带秩并查集)

qwb与学姐 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 149  Solved: 54[Submit][Status][Web Board] Description qwb打算向学姐表白,可是学姐已经受够了他的骚扰,于是出了一个题想难住他:已知一幅n个点m条边的无向图,定义路径的值为这条路径上最短的边的长度,现在有 k个询问,询问从A点到B点的所有路径的值的最大值.qwb听完这个问题很绝望啊,聪明的你能帮帮他吗? Input 一组数据.第一行三

qwb与学姐

qwb与学姐 Time Limit: 1 Sec  Memory Limit: 128 MB Description qwb打算向学姐表白,可是学姐已经受够了他的骚扰,于是出了一个题想难住他:已知一幅n个点m条边的无向图,定义路径的值为这条路径上最短的边的长度,现在有 k个询问,询问从A点到B点的所有路径的值的最大值.qwb听完这个问题很绝望啊,聪明的你能帮帮他吗? Input 一组数据.第一行三个整数n,m,k (1<=N<=50000,m<=200000,k<=100000).

hdu1344卿学姐种美丽的花

地址:http://acm.uestc.edu.cn/#/problem/show/1344 题目: 卿学姐种美丽的花 Time Limit: 8000/4000MS (Java/Others)     Memory Limit: 125535/65535KB (Java/Others) Submit Status 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一样美丽的花.所以卿学姐家的后院有很多的花坛. 卿学姐有nn个花坛,一开始第ii个花坛里有A[i]A[i]朵花.每过一段

hdu1341卿学姐与城堡的墙

地址:http://acm.uestc.edu.cn/#/problem/show/1341 题目: 卿学姐与城堡的墙 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 卿学姐终于来到了魔王的城堡,城堡修建的十分壮观. 即使心中放不下公主,卿学姐还是忍不住驻足观赏这宏伟的建筑. 卿学姐注意到城堡的墙上有若干直线状的花纹. 可以将墙看做一个平面,卿学姐想

hdu1324卿学姐与公主

地址:http://acm.uestc.edu.cn/#/problem/show/1324 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了高山,跨过了大洋,卿学姐来到了魔王