首页 > 其他分享 >【题解】BZOJ 4403序列统计

【题解】BZOJ 4403序列统计

时间:2023-12-29 19:22:21浏览次数:35  
标签:return dbinom int 题解 4403 large ans binom BZOJ

tg.BZOJ 4403序列统计
pj.BZOJ 4403序列统计

没啥用的题解

\(QWQ\)——无脑思考

  • 首先要想怎么求单调不上升序列的个数,因为可能会有重复的数,所以不能直接用排列组合。
  • 那这道题怎么打呀? 我不知道啊\(\dots\)

\((~:\)

  • 因为原来是单调不下降序列,将第 \(i\) 位上的数加 \(i\) ,于是变成单调上升序列。于是 \(L\) 变成 \(L+1\) ,\(R\) 变成 \(R+n\) ,于是就要求出 $$\sum_{i=1}^{n}\binom {R-L+i}{R-L}$$
  • 因为 $$\large\binom{n}{m}=\frac{n!}{m!(n-m)!}$$
  • 所以 $$\large\binom{n}{m+1}=\frac{(n)!}{(m+1)!(n-m-1)!}$$
  • 所以 $$\large\binom{n}{m}+\binom{n}{m+1}=\frac{n!}{m!(n-m)!}+\frac{n!}{(m+1)!(n-m-1)!}=\dfrac{(n+1)n!}{(m+1)m!(n-m)!}$$
  • 最后得出 $$\large\dbinom{n}{m}+\dbinom{n}{m+1}=\binom{n+1}{m+1}$$
  • 所以在第一个地方加上一个 \(\large\dbinom{R-L+1}{R-L+1}\) ,于是与第一个合并成为 \(\large\dbinom{R-L+2}{R-L+1}\) 。同理,最后合并成 \(\large\dbinom{R-L+n+1}{R-L+1}\) 。
  • 所以 \(\large\dbinom{R-L+n+1}{R-L+1}\%P\) 就是每个输入的解。

容易死的地方

  • \(\large n=0\) 时,要输出 \(0\) 。
  • 记得加上模数,防止出来负数。

代码

#include<bits/stdc++.h>
#define ls (p<<1)
#define rs (p<<1|1)
#define endl '\n'
#define N (10000010)
#define int long long
using namespace std;
namespace IO
{
    #define ll long long
    const int MAX=1<<25;
    char buf[MAX],*p1=buf,*p2=buf;
    char obuf[MAX],*o=obuf;
    #define gc()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
    //template<typename T>
    //inline T read()
    inline int read()
    {
        int x=0;bool f=1;
        char c=gc();
        for(;c<48||c>57;c=gc())if(c=='-')f=0;
        for(;c>=48&&c<=57;c=gc())x=(x<<3)+(x<<1)+(c^48);
        return f?x:~x+1;
    }
    void print(ll x){if(x>9)print(x/10);*o++=(x%10)+'0';}
    void pit(ll x){if(x<0)*o++='-',x=~x+1;print(x);}
    void write(ll x,char end){pit(x);*o++=end;}
    void flush(){fwrite(obuf,o-obuf,1,stdout);}
    #undef ll
}
using IO::read;using IO::write;using IO::flush;
int n,m,t,P;
int x,y,k,L,R,tot,lon;
int len,prime[700010];//,phi[N];//线性筛欧拉函数
bitset<N>vis;
long long inv[N];//乘法逆元
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
inline void swap(int &x,int &y){int tmp=x;x=y;y=tmp;}
int e[N],siz[N];
long long qpow(long long x,int b,int P=P)
{
    long long ans=1;
    for(;b;b>>=1){if(b&1)ans=(ans*x)%P;x=(x*x)%P;}
    return ans;
}//O(log(b))
int exgcd(int a,int b,int &x,int &y)
{
    if(!b){x=1,y=0;return a;}
    int d=exgcd(b,a%b,y,x);
    y-=(a/b*x);
    return d;
}//O(max(a,b))
int ola(int n)
{
    int ans=n;
    for(int i=2;i*i<=n;++i)
    {
        if(n%i==0)ans=ans/i*(i-1);
        for(;n%i==0;n/=i);
    }
    if(n>1)ans=ans/n*(n-1);
    return ans;
}//O(sqrt(n))
void eular(int n)//欧拉筛
{
    //memset(vis,0,sizeof(vis));
    //phi[1]=1;
    for(int i(2);i<=n;++i)
    {
        if(!vis[i])
            prime[++len]=i;//,phi[i]=(i-1);
        for(int j(1);j<=len&&i*prime[j]<=n;++j)
        {
            vis[i*prime[j]]=1;
            /*
            if(!(i%prime[j]))
                {phi[i*prime[j]]=(phi[i]*prime[j]);break;}
            else phi[i*prime[j]]=(phi[i]*(prime[j]-1));
            */
        }
    }
}//O(n)
void niyuan1(int n)//乘法逆元
{
    inv[1]=1;
    for(int i(2);i<=n;++i)inv[i]=((P-P/i)*inv[P%i])%P;
}//O(n)
int inv_it(int a)//O(log(a))
{
    int d(exgcd(a,P,x,y));
    return (x%P+P)%P;
}
int C(int n,int m,int P=P)
{return (m>n)?0:(e[n]*qpow((e[m]*e[n-m])%P,P-2))%P;}
int lucas(int n,int m,int P=P)
{return (!m)?1:(C(n%P,m%P)*lucas(n/P,m/P))%P;}
void init()
{
    P=(1e6)+3;e[1]=1;
    for(int i(2);i<=(1e6)+4;++i)e[i]=(e[i-1]*i)%P;
}
signed main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    init();
    for(t=read();t;--t)
    {
        n=read(),L=read(),R=read();
        if(!n){write(0,'\n');continue;}
        lon=R-L+1;
        write((lucas(lon+n,lon)-1+P)%P,'\n');
    }
    flush();
    return 0;
}

标签:return,dbinom,int,题解,4403,large,ans,binom,BZOJ
From: https://www.cnblogs.com/minecraft666/p/17935564.html

相关文章

  • CF1806F GCD Master 题解
    题目链接EasyversionHardversion题目解法参考DeaphetS的题解很有意思的题,感觉\(F1\)不到\(*2900\),\(F2\)超过\(*2900\)F1简化题目中的操作:把\(n\)个数放到\(n-k\)组中,求\(\max(\sum\)每组\(a_i\)的\(\gcd)\)首先考虑所有数互不相同的情况结论1:把\(k+......
  • [CF30E] Tricky and Clever Password 题解
    [CF30E]TrickyandCleverPassword题解注意到一个合法字符串首尾相同,考虑用S的反转和S跑KMP。对于只有一个串,暴力manacher即可。匹配到某一位置\((i,j)\)时,查询区间最长的奇回文串长度,用二分+ST表解决,因为回文串不能超过区间长度。//Problem:TrickyandCle......
  • P9994 [Ynoi Easy Round 2024] TEST_132 题解
    题解怎么都是用暴力日过去的啊。思路考虑根号分治,设阈值为\(B\)。对于第二维出现次数超过\(B\)的,我们可以在修改时暴力更改,这部分复杂度为\(O(\frac{nm}{B})\)。对于第二维出现次数小于\(B\)的,我们可以在修改是打标记,查询时遍历一遍,这部分的复杂度为\(O(mb)\)。大多数......
  • P9995 [Ynoi2000] rspcn 题解
    思路比较典的ODT题目。发现排序是一个非常有性质的操作。它对区间的更改与颜色段均摊差不多。那么我们可以想到用ODT来维护这一整个序列。具体的,区间排序操作可以用ODT维护每次排序产生的段,每段用线段树维护排序后的结果。每次修改就可以进行线段树的分裂与合并。如......
  • P9991 [Ynoi Easy Round 2023] TEST_107 题解
    思路题目即要求删除区间中的一个或多个颜色。考虑假如枚举删除颜色\(k\)。那么在\(l,r\)中的答案为:\[\max_{i=1}^{m+1}a_i-a_{i-1}\]其中\(a_i\)为颜色\(k\)在\(l\simr\)中的出现位置,\(a_{0}=l,a_{m+1}=r\)。可以分类讨论。答案为\(a_1-l\),那么只需要维护\(......
  • AT_abc020_c 题解
    链接(atcoder)链接(luogu)简单算法组合(?算法一爆搜,时间复杂度\(O(2^{n\timesm}\timest)\),不能通过此题。算法二考虑二分\(t\),然后暴搜,时间复杂度\(O(2^{n\timesm}\timeslog2(t))\),不能通过此题。算法三考虑二分\(t\),然后暴记忆化搜索,时间复杂度\(O(n\timesm......
  • CF1234F 题解
    blog。小清新题,下文\(V=20\)即值域。反转操作,本质就是选两个不相交连续段拼起来。显然合法的最终串长度一定\(\leV\)。将这些合法串预处理出来,那么每个串都对应一个「字母集合」。随便DP一下,求出所有集合中,的最大的合法「字母集合」大小。\(dp_{\smallU}\)就是只选一......
  • CF1917F Construct Tree 题解
    题目链接:https://codeforces.com/contest/1917/problem/F题意有\(n\)条长度\(l_i\)的边,问它们是否能组成一棵\(n+1\)个节点的树,使得树的直径长度为\(d\)。\(n,d\le2000\)。题解首先当然要存在一个边集\(D\),使得\(\sum\limits_{i\inD}l_i=d\),这可以使用背包......
  • 在不使用内置函数和中间变量的情况交换数字LeetCode力扣题解面试题16.01
    #异或法#Kotlin```KotlinclassSolution{  funswapNumbers(numbers:IntArray):IntArray{    numbers[0]=numbers[0]xornumbers[1]    numbers[1]=numbers[1]xornumbers[0]    numbers[0]=numbers[0]xor......
  • AT_joisc2015_h 题解
    传送门题意:给定长为\(n\)的字符串\(s\),你可以选择一个区间,将区间内的字符从小到大排序,求可以得到的最长回文子串长度,字符集大小为\(n\)。很有意思的题目。首先容易做到\(O(n^3)\)。考虑怎么优化。我们先考察排序的区间和回文区间的关系。如果两个区间无交,那么显然排序......