首页 > 其他分享 >Codeforces 451E Devu and Flowers

Codeforces 451E Devu and Flowers

时间:2024-02-29 14:22:19浏览次数:15  
标签:int sum Codeforces tot i64 maxn Devu Flowers mod

首先考虑没有 \(f_i\) 的限制的时候,此时可以用插板法得到方案数为 \(\binom{s + n - 1}{n - 1}\)。

考虑钦定 \(f_i\) 不合法,那么就相当于先在 \(i\) 这里选 \(f_i + 1\),剩下的随意分配,方案数就为 \(\binom{s - (f_i + 1) + n - 1}{n - 1}\)。

算完过后能发现会算重存在 \(> 1\) 个 \(f_i\) 不合法的情况。
那么就可以用容斥来算。

考虑钦定不合法的下标为 \(p_{1\sim k}\),方案数即为 \(\binom{s - \sum_{i = 1}^k(f_{p_i} + 1) + n - 1}{n - 1}\)。
容斥系数即为 \((-1)^k\)。

因为 \(n\le 20\),可以考虑暴力枚举 \(p\) 的所有可能去算。

时间复杂度 \(O(2^nn)\)。

代码
#include<bits/stdc++.h>
using i64 = long long;
const i64 mod = 1e9 + 7;
inline i64 qpow(i64 a, i64 b) {i64 v = 1; while (b) b & 1 && ((v *= a) %= mod), b >>= 1, (a *= a) %= mod; return v;}
const int maxn = 20 + 5;
i64 f[maxn], invf[maxn];
inline i64 C(i64 n, int m) {
    i64 tot = invf[m];
    while (m--) (tot *= n-- % mod) %= mod;
    return tot;
}
int main() {
    int n; i64 sum; scanf("%d%lld", &n, &sum);
    for (int i = 1; i <= n; i++) scanf("%lld", &f[i]);
    invf[0] = 1;
    for (int i = 1; i <= n; i++) invf[i] = invf[i - 1] * qpow(i, mod - 2) % mod;
    i64 ans = 0;
    for (int s = 0; s < (1 << n); s++) {
        i64 S = sum;
        for (int i = 0; i < n; i++) s >> i & 1 && (S -= f[i + 1] + 1);
        if (S < 0) continue;
        if (__builtin_popcount(s) & 1) (ans += mod - C(S + n - 1, n - 1)) %= mod;
        else (ans += C(S + n - 1, n - 1)) %= mod;
    }
    printf("%lld\n", ans);
    return 0;
}

标签:int,sum,Codeforces,tot,i64,maxn,Devu,Flowers,mod
From: https://www.cnblogs.com/rizynvu/p/18043636

相关文章

  • Codeforces 1830C Hyperregular Bracket Strings
    考虑到区间的限制\([l,r]\)就是要求\([l,r]\)里的字符会在\([l,r]\)里找到匹配。假设还有个区间\([l',r']\)满足\(l\lel'\ler\ler'\),能够发现限制变成了\([l,l'),[l',r],(r,r']\)这\(3\)个区间内的字符能在对应区间内找到匹配。继续,假设\(l\lel'\le......
  • Codeforces 863E Turn Off The TV
    能发现其实就是区间加查询区间最小值。如果最小值\(>1\)则这个区间可以删掉。考虑离散化端点,先把区间表示为\([l_i,r_i)\)的形式,方便离散化端点。这样子离散化出来的端点也是\([x,y)\)的形式。对于区间加查询区间最小值,很容易用线段树维护。时间复杂度\(O(n\logn)......
  • Codeforces Round 929 (Div. 3)
    CodeforcesRound929(Div.3)A-TurtlePuzzle:RearrangeandNegate代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pa......
  • 13 Codeforces Round 886 (Div. 4)G. The Morning Star(简单容斥)
    G.TheMorningStar思路:用map记录x,y,以及y-x、y+x从前往后统计一遍答案即可公式\(ans+=cnt[x]+cnt[y]-2*cnt[x,y]+cnt[y+x]+cnt[y-x]\)\(cnt[x]+cny[y]-2*cnt[x,y]\)是统计坐标轴方向的,-2倍是需要把本身这个点给减去容斥是减一倍,这里还需要把自己给挖掉\(cnt[y+x]+cnt[y......
  • Codeforces 264E Roadside Trees
    首先考虑时间增长的问题,设第\(i\)棵树的种植时间为\(t_i\)。那么第\(x\)棵树比第\(y\)棵树高就是\(h_x+(t_y-t_x)>h_y\),也就是\(h_x-t_x>h_y-t_y\)。所以可以直接用\(h_i-t_i\)当作第\(i\)棵树的高度,即\(h'_i\leftarrowh_i-t_i\)。对于增加,考虑......
  • CodeForces 1844H Multiple of Three Cycles
    洛谷传送门CF传送门首先环是不用管的,只用判环长是否为\(3\)的倍数即可。考虑设\(f(x,y,z)\)表示\(x\)个\(1\)链,\(y\)个\(2\)链,\(z\)个\(0\)链,组成所有环长都为\(3\)的倍数的方案数。注意到\(f(x,y,z)=(x+y+z)f(x,y,z-1)\)(可以接到剩下的任意......
  • Codeforces Round 929 (Div. 3)
    B.TurtleMath:FastThreeTask数学#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e5+10;inta[N];voidsolve(){ intn; cin>>n; intsum=0; map<int,int>mp; intmx=0; for(inti=1;i<=n;i++){ cin......
  • 11 .Codeforces Round 891 (Div. 3)E. Power of Points(推公式+前缀和优化)
    E.PowerofPoints题解参考#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=(a);i<=(b);++i)#definefep(i,a,b)for(inti=(a);i>=(b);--i)#define_for(i,a,b)for(inti=(a);i<(b);++i)#definepii......
  • Codeforces Round 929 (Div. 3) 题解(D-G)
    比赛链接:https://codeforces.com/contest/1933官解暂未放出。质量不错的一场D3。CF1933D.TurtleTenacity:ContinualMods题意将数组\(a_{1..n}\ge1\)重排,问是否能使\(((a_1\mathbin{\rmmod}a_2)\mathbin{\rmmod}a_3)\cdots\mathbin{\rmmod}a_n\ne0\)......
  • Codeforces Round 929 (Div. 3)
    CodeforcesRound929(Div.3)比赛链接A.TurtlePuzzle:RearrangeandNegate思路根据题意,很明显数组中所有元素的绝对值总和就是答案Code#include<bits/stdc++.h>usingnamespacestd;#defineall(x)x.begin()+1,x.end()#defineintlonglongvoidsolve(){......