PKUSC 模拟赛 题解_UPD

时间:2022-12-19 19:17:30

之前挖了两个大坑

一个是day1下午的第二题

另一个是day2上午的第五题

先说day1下午的第二题吧

我们显然不能O(n^2)的dp,所以我们只能算贡献

首先对于任意一个边界点而言,他对答案的贡献路径有很多,但是贡献的系数都形如a^c*b^d的形式

而且很容易发现贡献系数是一个定值,那么贡献次数就等于贡献路径的条数,就等于从这个点走到(n,n)的方案数

这是能用组合数算出来的

可以得出贡献系数为 C(2n-i-2,n-i)*a^(n-1)*b^(n-i)或者C(2n-i-2,n-i)*a^(n-i)*b^(n-1)

也就是所有边界点的贡献我们可以在O(n)的时间内算出,接下来考虑c的贡献

不妨还是利用上面的思路,可以得到c的贡献为c*sigma(C(2n-i-j,n-i)*a^(n-j)*b^(n-i))

不难发现这是个卷积形式,我们不妨设

f(i+j)=(2n-i-j)!

g(j)=a^(n-j)/(n-j)!

h(i)=b^(n-i)/(n-i)!

然后利用FFT求出g(j)*h(i),之后枚举i+j O(n)扫一遍计算就可以啦

模数不太优美,所以采用将数分解成k*blo+b的形式做FFT

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std; typedef long long LL;
const int maxn=600010,mod=1000003,M=1000;
int n,a,b,c,k,N,L,ans;
int pa[maxn],pb[maxn];
int jc[maxn],rev[maxn],inv[maxn];
int a0[maxn],b0[maxn],a1[maxn],b1[maxn];
int aa[maxn],bb[maxn],C[maxn];
const long double pi=acos(-1.0);
struct cpx{
long double r,i;
cpx(long double r=0,long double i=0):r(r),i(i){}
cpx cp(){return cpx(r,-i);}
}A[maxn],B[maxn];
cpx operator +(const cpx &A,const cpx &B){return cpx(A.r+B.r,A.i+B.i);}
cpx operator -(const cpx &A,const cpx &B){return cpx(A.r-B.r,A.i-B.i);}
cpx operator *(const cpx &A,const cpx &B){return cpx(A.r*B.r-A.i*B.i,A.r*B.i+A.i*B.r);}
void read(int &num){
num=0;char ch=getchar();
while(ch<'!')ch=getchar();
while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
}
int pow_mod(int v,int p){
int tmp=1;
while(p){
if(p&1)tmp=1LL*tmp*v%mod;
v=1LL*v*v%mod;p>>=1;
}return tmp;
}
void init_a(){
read(k);
for(int i=2;i<=n;++i){
read(k);
ans=ans+1LL*jc[(n<<1)-i-2]*inv[n-i]%mod*pa[n-1]%mod*pb[n-i]%mod*k%mod;
if(ans>=mod)ans-=mod;
}return;
}
void init_b(){
read(k);
for(int i=2;i<=n;++i){
read(k);
ans=ans+1LL*jc[(n<<1)-i-2]*inv[n-i]%mod*pa[n-i]%mod*pb[n-1]%mod*k%mod;
if(ans>=mod)ans-=mod;
}return;
}
void FFT(cpx A[],int n,int type){
for(int i=1;i<n;++i)if(i<rev[i])swap(A[i],A[rev[i]]);
for(int k=0;(1<<k)<n;++k){
int m=(1<<k),m2=(m<<1);
long double o=pi*2/m2*type;
cpx wn(cos(o),sin(o));
for(int i=0;i<n;i+=m2){
cpx w(1,0);
for(int j=0;j<m;++j){
cpx x=A[i+j],y=A[i+j+m]*w;
A[i+j]=x+y;A[i+j+m]=x-y;
w=w*wn;
}
}
}
if(type==-1)for(int i=0;i<n;++i)A[i].r/=n;
}
void mul(int *a,int *b,int *c){
for(int i=0;i<N;++i)A[i]=cpx(a[i],0);
for(int i=0;i<N;++i)B[i]=cpx(b[i],0);
FFT(A,N,1);FFT(B,N,1);
for(int i=0;i<N;++i)A[i]=A[i]*B[i];
FFT(A,N,-1);
for(int i=0;i<N;++i)c[i]=((LL)(A[i].r+0.5))%mod;
}
void mul_mod(int *a,int *b,int *c){
for(int i=0;i<N;++i)a0[i]=a[i]/M,b0[i]=b[i]/M;
mul(a0,b0,a0);
for(int i=0;i<N;++i){
c[i]=1LL*a0[i]*M*M%mod;
a1[i]=a[i]%M;b1[i]=b[i]%M;
}
mul(a1,b1,a1);
for(int i=0;i<N;++i){
c[i]=c[i]+a1[i];
if(c[i]>=mod)c[i]-=mod;
a0[i]=a0[i]+a1[i];
if(a0[i]>=mod)a0[i]-=mod;
a1[i]=a[i]/M+a[i]%M;
b1[i]=b[i]/M+b[i]%M;
}
mul(a1,b1,a1);
for(int i=0;i<N;++i){
c[i]=c[i]+1LL*M*(a1[i]-a0[i]+mod)%mod;
if(c[i]>=mod)c[i]-=mod;
}return;
} int main(){
read(n);read(a);read(b);read(c);
pa[0]=pb[0]=1;jc[0]=1;
for(int i=1;i<=n;++i)pa[i]=1LL*pa[i-1]*a%mod;
for(int i=1;i<=n;++i)pb[i]=1LL*pb[i-1]*b%mod;
for(int i=1;i<=(n<<1);++i)jc[i]=1LL*jc[i-1]*i%mod;
inv[n<<1]=pow_mod(jc[n<<1],mod-2);
for(int i=(n<<1)-1;i>=0;--i)inv[i]=1LL*inv[i+1]*(i+1)%mod;
init_a();init_b();ans=1LL*ans*inv[n-2]%mod;
for(N=1,L=0;N<=n;N<<=1,L++);N<<=1,L++;
for(int i=0;i<N;++i)rev[i]=rev[i>>1]>>1|((i&1)<<(L-1));
for(int i=2;i<=n;++i)aa[i]=1LL*pa[n-i]*inv[n-i]%mod;
for(int i=2;i<=n;++i)bb[i]=1LL*pb[n-i]*inv[n-i]%mod;
mul_mod(aa,bb,C);
for(int i=4;i<=(n<<1);++i){
ans=ans+1LL*C[i]*jc[(n<<1)-i]%mod*c%mod;
if(ans>=mod)ans-=mod;
}printf("%d\n",ans);
return 0;
}

day2上午第五题

不难发现这道题是要求概率的,由于是要求连续赢了m盘,所以我们只需要知道队头连续赢了多少就可以了

不妨设f(i,j)表示队头连续赢了i局,队里的第j个人获胜的概率

然后分j=1,2,3,4和j>4分类讨论就可以啦,列出方程之后发现是有环的

然后高斯消元解一下就可以了

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#define eps 1e-5
using namespace std; const int maxn=120;
int T,cnt,kase;
int n,m,k;
double a[maxn][maxn];
int idx[maxn][maxn]; void Gauss(int n){
int to;
for(int i=1;i<=n;++i){
for(to=i;to<=n;++to)if(fabs(a[to][i])>eps)break;
if(to!=i)for(int j=1;j<=n+1;++j)swap(a[to][j],a[i][j]);
double tmp=a[i][i];
for(int j=1;j<=n+1;++j)a[i][j]/=tmp;
for(int j=1;j<=n;++j){
if(j==i)continue;
double tmp=a[j][i]/a[i][i];
for(int k=1;k<=n+1;++k){
a[j][k]-=tmp*a[i][k];
}
}
}return;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&k);
cnt=0;
for(int i=0;i<=m;++i){
for(int j=1;j<=n;++j)idx[i][j]=++cnt;
}
memset(a,0,sizeof(a));
for(int i=0;i<m;++i){
for(int j=1;j<=n;++j){
int now=idx[i][j],cur;
a[now][now]--;
if(j==1){
cur=idx[i+1][j];
a[now][cur]+=0.25;
cur=idx[1][n-2];
a[now][cur]+=0.75;
}else if(j==2){
cur=idx[1][1];
a[now][cur]+=0.25;
cur=idx[i+1][n-2];
a[now][cur]+=0.25;
cur=idx[1][n-1];
a[now][cur]+=0.5;
}else if(j==3){
cur=idx[1][1];
a[now][cur]+=0.25;
cur=idx[i+1][n-1];
a[now][cur]+=0.25;
cur=idx[1][n-1];
a[now][cur]+=0.25;
cur=idx[1][n];
a[now][cur]+=0.25;
}else if(j==4){
cur=idx[1][1];
a[now][cur]+=0.25;
cur=idx[i+1][n];
a[now][cur]+=0.25;
cur=idx[1][n];
a[now][cur]+=0.5;
}else{
cur=idx[i+1][j-3];
a[now][cur]+=0.25;
cur=idx[1][j-3];
a[now][cur]+=0.75;
}
}
}
for(int i=1;i<=n;++i){
int now=idx[m][i];
a[now][now]--;
if(i==1)a[now][cnt+1]=-1;
}
Gauss(cnt);kase++;
printf("Case #%d: %.6lf\n",kase,a[idx[0][k]][cnt+1]);
}return 0;
}

PKUSC 模拟赛 题解_UPD的更多相关文章

  1. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

  2. 大家AK杯 灰天飞雁NOIP模拟赛题解&sol;数据&sol;标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  3. PKUSC 模拟赛 day1 下午总结

    下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...

  4. PKUSC 模拟赛 day2 下午总结

    终于考完了,下午身体状况很不好,看来要锻炼身体了,不然以后ACM没准比赛到一半我就挂掉了 下午差点AK,有一道很简单的题我看错题面了所以没有A掉 第一题显然是非常丝薄的题目 我们很容易通过DP来O(n ...

  5. PKUSC 模拟赛 day1 上午总结

    思考了一下第二题,觉得有无数种乱搞做法 类似什么bitset压位,MCS染色之类奇怪的做法 然而都是玄学正确性或者玄学复杂度 先放题解把 第一题显然具有单调性,二分就可以啦 O(nlogn),貌似输出 ...

  6. 【洛谷】xht模拟赛 题解

    前言 大家期待已久并没有的题解终于来啦~ 这次的T1和HAOI2016撞题了...深表歉意...表示自己真的不知情... 天下的水题总是水得相似,神题各有各的神法.--<安娜·卡列妮娜> ...

  7. PKUSC 模拟赛 day2 上午总结

    今天上午考得不是很好,主要还是自己太弱QAQ 开场第一题给的图和题意不符,搞了半天才知道原来是走日字形的 然后BFS即可 #include<cstdio> #include<cstr ...

  8. 10&period;6-10&period;7 牛客网NOIP模拟赛题解

    留个坑... upd:估计这个坑补不了了 如果还补不了就删了吧

  9. 2019 蓝桥杯国赛 B 组模拟赛 题解

    标签 ok #include<bits/stdc++.h> using namespace std; /* 求阶乘 去除尾部0 每次求阶乘时:结果去除尾0,并对 1e6取余 */ type ...

随机推荐

  1. APP支付报错ALI40247处理方案&excl;

    简直日狗!这里要吐槽支付宝: 1.支付宝文档太复杂,分类虽然详细,但是我找不到app支付 对应服务端的demo 2.提供下载的sdk都是全整合的 用下来都是一条龙服务,还有一些客户端(app)的请求也 ...

  2. redis2&period;8--主从机同步流程

  3. IEnumerable 接口 实现foreach 遍历 实例

    额 为啥写着东西? 有次面试去,因为用到的时候特别少 所以没记住, 这个单词 怎么写! 经典的面试题: 能用foreach遍历访问的对象的要求? 答:  该类实现IEnumetable 接口   声明 ...

  4. IAM

    IAM 与 权限访问控制机制 IAM , Identity and Access Management 基本概念 ARN, Amazon Resource Name : 在 AWS 里, 创建的任何资 ...

  5. SmartSql 入门

    入门 安装 Install-Package SmartSql Install-Package SmartSql.Schema // 以及相应ADO.NET驱动 从连接字符串创建SmartSql实例 v ...

  6. C&num; 10分钟完成百度人脸识别——入门篇

    嗨咯,小编在此祝大家新年快乐财多多! 今天我们来盘一盘人脸注册.人脸识别等相关操作,这是一个简单入门教程. 话不多说,我们进入主题: 完成人脸识别所需的步骤: 注册百度账号api,创建自己的应用: 创 ...

  7. tp3&period;2 上传文件及下载文件

    公共方法 UploadFile.class.php() // 开始 , , , ,];];,; ;; ::::::;,) {//文件上传失败 //捕获错误代码$this->error($file ...

  8. Android 弹性布局 FlexboxLayout了解一下

    原文链接:https://mp.weixin.qq.com/s/Mi3cK7xujmEMI_rc51-r4g RelativeLayout.LinearLayout等常用布局相信大家早已耳熟能详,今天 ...

  9. Hive原理总结(完整版)

    目录 课程大纲(HIVE增强) 3 1. Hive基本概念 4 1.1 Hive简介 4 1.1.1 什么是Hive 4 1.1.2 为什么使用Hive 4 1.1.3 Hive的特点 4 1.2 H ...

  10. 如何发布开源自己的框架或类库到CocoaPods - 图文讲解

    当自己的库已经上传GitHub后,那么如何快速简单的开源自己的库呢? 这里就是介绍如何将自己的类库上传到pods管理库,以便开源所有人都能方便使用. 准备前提: - 项目已上传到GitHub (注意, ...