题目

描述

你要在\(m\)天内,刷\(n\)道题,每天可以刷的题的数目不限;

第\(i\)天可以刷的题目的种类是\(ui+v\);

两种刷题的方案不同当且仅当某天刷题的数量不同或者依次刷题的种类不同;

有\(T\)组询问,每组给出\(n,m,u,v\);

范围

$1 \le T \le 5 \ , \ 1 \le n \le 10^{18} , 1 \le m \le 2 \times 10^5 , 1 \le u , v \le 10^9 $

题解

  • 典型的数学题,给出两种推导;

  • 首先答案是:

    \[\begin{align}
    & \sum_{k_1+k_2+\cdots + k_m = n} t_1^{k_1} t_2^{k_2} \cdots t_m^{k_m} , \ \ \ 其中 t_i = ui+v \\
    \end{align}
    \]

  • solve 1

    \[\begin{align}
    &以下方法的基本思路是利用组合意义推导: \\
    &Part \ 1 \\
    &考虑现在有一些球,这些球上有一个数字1 \to m; \\
    &同时这些球有颜色,其中第i(1<i<m)球标号的球有u种颜色,第m种球有u+v种颜色; \\
    &两个球相同当且仅当编号和颜色都相同; \\
    &现在用这些球构成一个n+m-1长度的序列,满足: \\
    &\ \ \ *编号为1 \to m-1的球都出现过,记他们第一次出现的位置为:1 \le p_1 , p_2 , \cdots , p_{m-1}\le n+m-1 \\
    &\ \ \ *这些球第一次出现的位置满足:1 \le p_1 \lt p_2 \lt p_3 \lt \cdots \lt p_{m-1} \le n+m-1 \\
    &Par \ 2 \\
    &先放好p_i , 考虑p_i和p_{i-1}+1中间可以放的球种类是\ ui+v \ , \ 所以计数这样子的序列是:
    \\
    &\ \ \ \ u^{m-1} \sum_{1 \lt p_1 \lt p_2 \lt \cdots \lt p_{m-1} \lt n+m-1 }(u+v)^{p_1-1} (2u+v)^{p_2-p_1-1} (3u+v)^{p_3-p_2-1} \cdots (mu+v)^{n+m-1-p_{m-1}-1}
    \\
    &前面乘上u^{m-1}是因为p_{1}到p_{m-1}都是u种颜色可选,这样也可以知式子种指数的和是(n+m-1)-(m-1)=n; \\
    &所以这个式子是答案的u^{m-1}倍,我们只需要计数序列个数除以u^{m-1}即可得到答案;\\
    &Part \ 3 \\
    &进一步前m-1种球都是等价的,所以简化条件成: \\
    &\ \ \ *编号为1 \to m-1的球都出现过; \\
    &用这个除以(m-1)!即可得到原构造序列的个数; \\
    &Part \ 4 \\
    &利用容斥算出满足简化条件的序列: \\
    &\sum_{S} (-1)^{|S|} (mu + v -|S|u) ^ {n+m-1} \\
    &=\sum_{k=0}^{m-1}(-1)^k (^{m-1}_k) (mu+v-ku)^{n+m-1} \\
    &综上:答案即是:\frac{\sum_{k=0}^{m-1}(-1)^k (^{m-1}_k) (mu+v-ku)^{n+m-1}}{(m-1)!u^{m-1}}
    \end{align}
    \]

  • solve 2

    \[\begin{align}
    &以下方法的基本思路是利用生成函数和增量去构造;\\
    &Part \ 1 \\
    &考虑答案即是:[x^n]\Pi_{i=1}^{m}\frac{1}{1-t_ix}\\
    &设G(x)=\Pi_{i=1}^{m}\frac{1}{1-t_ix}\\
    &假设G(x)有另一种有限项的形式:G(x)=\sum_{i=1}^{m}\frac{a_i}{1-t_ix}\\
    &Part \ 2 \\
    &尝试用增量法去求出系数a_i,这样我们也同时证明了这种形式的存在;\\
    &首先明确一个式子:\frac{1}{ab}=(\frac{1}{a}-\frac{1}{b})\frac{1}{b-a} &(1) \\
    &假设现在已经求出了前m-1项乘积的系数a_{m-1,1},\cdots,a_{m-1,m-1};\\
    &考虑乘上一个\frac{1}{1-t_mx} ,即:\\
    &\sum_{i=1}^{m-1}\frac{a_i}{1-t_ix}\frac{1}{1-t_mx} &(2) \\
    &带入(1),=\sum_{i=1}^{m-1}a_i(\frac{1}{1-t_ix}-\frac{1}{1-t_mx})\frac{1}{(i-m)ux} &(3)\\
    &把ux直接踢出去,最后的G'(x)乘上一个u^{m-1}x^{m-1} \\
    &所以只考虑\sum_{i-1}^{m-1}\frac{a_i}{i-m}\frac{1}{1-t_ix}+\frac{a_i}{m-i}\frac{1}{1-t_mx}\\
    &所以可以得到:\\
    &a_{i,j}=\frac{a_{i-1,j}}{j-i};(j<i)&(4)\\
    &a_{i,i}=\sum_{j=1}^{i-1}\frac{a_{i-1,j}}{i-j} &(5)\\
    &Part \ 3 \\
    &为了方便我们设f_i=a_{i,i},(4)可以被进一步写成:a_{i,j}=f_j\frac{(-1)^{i-j}}{(i-j)!} \ &(6)\\
    &把(6)带入(5)化简:\\
    &f_{i}=\sum_{j=1}^{i-1}f_j\frac{(-1)^{i-j-1}}{(i-j)!}\\
    &此时记F(x)为f_{i}的OGF,F(x)=F(x)*(1-e^{-x})+x;\\
    &解得:F(x)=xe^x;\\
    &所以f_i=[x^i]F(x)=\frac{1}{(i-1)!}; &(7) \\
    &Part 4\\
    &接下来就只需要利用(4)和(7)简单化简求答案;\\
    &ans=[x^n]G(x)\\
    &=[x^n]\frac{G'(x)}{u^{m-1}x^{m-1}} \\
    &=\frac{1}{u^{m-1}}[x^{n+m-1}]G'(x) \\
    &=\frac{1}{u^{m-1}}\sum_{k=1}^{m}a_{m,k}t_{k}^{ \ n+m-1}\\
    &=\frac{1}{u^{m-1}}\sum_{k=1}^{m}f_k\frac{(-1)^{m-k}}{(m-k)!}(uk+v)^{n+m-1}\\
    &=\frac{\sum_{k=1}^{m}\frac{(-1)^{m-k}}{(k-1)!(m-k)!}(uk+v)^{n+m-1}}{u^{m-1}}\\
    &=\frac{\sum_{k=0}^{m-1}(-1)^{k}(mu+v-ku)^{n+m-1}}{(m-k-1)!k!u^{m-1}}\\
    &=\frac{\sum_{k=0}^{m-1}(-1)^{k}(^{m-1}_k)(mu+v-ku)^{n+m-1}}{(m-1)!u^{m-1}}
    \end{align}
    \]

  • 两种方法都差不多巧妙只是第二种数学化简比较多所以看起来有点长;

  • 代码就很没意思了->_<-;

    #include<bits/stdc++.h>
    #define ll long long
    #define mod 998244353
    using namespace std;
    const int N=200010;
    ll n;
    int m,u,v,fac[N];
    int pw(int x,int y){
    int re=1;
    while(y){
    if(y&1)re=(ll)re*x%mod;
    x=(ll)x*x%mod;y>>=1;
    }
    return re;
    }
    int main(){
    freopen("ioer.in","r",stdin);
    freopen("ioer.out","w",stdout);
    int T;cin>>T;
    for(int i=fac[0]=1;i<=2e5;++i)fac[i]=(ll)fac[i-1]*i%mod;
    while(T--){
    cin>>n>>m>>u>>v;
    int y=(n+m-1)%(mod-1),x=((ll)m*u+v)%mod,c=1,ans=0;
    for(int i=0;i<=m-1;++i){
    int now = (ll)c*pw(x,y)%mod;
    if(i&1)ans=(ans-now+mod)%mod;else ans=(ans+now)%mod;
    x=(x-u+mod)%mod;
    c=(ll)(m-i-1)*pw(i+1,mod-2)%mod*c%mod;
    }
    ans=1ll*pw(fac[m-1],mod-2)*pw(u,(ll)(mod-2)*(m-1)%(mod-1))%mod*ans%mod;
    cout<<ans<<endl;
    }
    return 0;
    }

【纪中集训2019.3.23】IOer的更多相关文章

  1. 【纪中集训2019.3.23】Deadline

    题意 描述 一个二分图\((A,B)\),每个点额外有一个颜色0或者1: 匹配时,只能相同颜色的点匹配: 给出\(A\)中的颜色,问如何分配\(B\)种的颜色使得\((A,B)\)的最大匹配最小: 范 ...

  2. 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)

    题目 描述 ​ \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: ​ 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...

  3. 【纪中集训2019.3.12】Mas的仙人掌

    题意: ​ 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...

  4. 【纪中集训2019.3.11】Cubelia

    题目: 描述 给出长度为\(n\)的数组\(a\)和\(q\)个询问\(l,r\). 求区间\([l,r]\)的所有子区间的前缀和的最大值之和: 范围: $n \le 2 \times 10^5 , ...

  5. 【纪中集训2019.3.13】fft

    题意: 描述 一共有\(n+m\)道题,其中\(n\)道答案是\(A\),\(m\)道答案是\(B\): 你事先知道\(n和m\),问在最优情况下的期望答错次数,对\(998244353\)取模: 范 ...

  6. 【纪中集训2019.3.12】Z的礼物

    题意 已知\(a_{i} = \sum_{j=1}^{i} \{^{i} _{j} \}b_{j}\), 给出\(a_{1} 到 a_{n}\) : 求\(b_{l} 到 b_{r}\)在\(1e9+ ...

  7. 「中山纪中集训省选组D1T1」最大收益 贪心

    题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...

  8. 纪中集训 Day 2

    今天(其实是昨天= =)早上起来发现好冷好冷啊= = 吃完饭就准备比赛了,好吧B组难度的题总有一道不知到怎么写QAQ 太弱了啊!!! 蒟蒻没人权啊QAQ 今天第4题不会写,在这里说说吧 题目的意思就是 ...

  9. 纪中集训 Day1

    今天早上起来吃饭,发现纪中伙食真的是太差了!!!什么都不热,早餐的面包还好,然后就迎来了美好的早晨= = 早上做一套题,T1T2果断秒,T3一看就是noi原题,还好看过题解会写,然后就愉快的码+Deb ...

随机推荐

  1. 机器人平台框架Yarp - Yet another robot platform

    简介 ROS有强大和易用的特性,用的人很多,目前已经推出2.0版本,有相关的官网和论坛.然而其缺点也比较明显. 只能基于Ubuntu系统,且一个ROS版本只能对应一个具体的Ubuntu版本    通信 ...

  2. Leetcode_6. Zigzag convertion

    6. Zigzag convertion 对输入的字符串做锯齿形变换,并输出新的字符串,所谓zigzag变化如下图所示. 将"ABCDEFGHIJKL"做4行的锯齿变换,新的字符串 ...

  3. 笨办法学Python - 习题11-12: Asking Questions & Prompting People

    目录 1.习题 11: 提问 2.习题 12: 提示别人 3.总结 1.习题 11: 提问 学习目标:了解人机交互场景,熟悉raw_input 的用法. 1.在 Python2.x 中 raw_inp ...

  4. Linux 150命令之查看文件及内容处理命令 more split file diff paste wc dps2unix

    more命令 使用more命令显示more /var/log/boot.log-20171129文件,可以从图中看出,系统在显示满一个屏幕时暂停,使用空格可以翻页,使用Q键可以退出. split sp ...

  5. spring--两个数据源模板

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-met ...

  6. 使用JProfiler做性能分析过程

    供自己记录一下,也分享给大家使用JProfiler的过程(感谢教我使用这个工具的大佬),整个博客比较粗糙,希望对大家有帮助 1.首先安装好JProfiler,打开eclipse,右键你所要分析的项目, ...

  7. 饭来了小组Alpha冲刺阶段记录

    一.第一天 日期:2018/6/13 1.1今日完成任务情况以及遇到的问题 侯晓东: 1.完成任务项:具体了解了微信小程序的开发流程,然后大致规划了我们项目的进度和完成节点:汇总组员的进度,写博客:画 ...

  8. PHP面试题一

    http://www.viphper.com/?p=28 1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) $a = date("Y-m-d H:i:s&qu ...

  9. .NET WinForm下StatusStrip控件如何设置分隔线及部分子控件右对齐

    ssInfo.LayoutStyle = ToolStripLayoutStyle.StackWithOverflow;//StatusStrip 控件 tsslUpdate.Alignment = ...

  10. PAT 甲级 1142 Maximal Clique

    https://pintia.cn/problem-sets/994805342720868352/problems/994805343979159552 A clique is a subset o ...