1 条题解

  • 0
    @ 2025-8-24 22:55:32

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar sLMxf
    史莱姆先锋or死了吗小枫?/总会有... /机房风气蒸蒸日上/小号:crz_qwq&deadX

    搬运于2025-08-24 22:55:32,当前版本为作者最后更新于2024-02-25 13:46:49,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    或许更好的阅读体验/题目传送门

    前置芝士

    1. 二项式定理:$(a+b)^n=\sum \limits_{i=0}^{n}C^i_n\times a^i\times b^{n-i}$
    2. 快速幂

    Meaning

    nn 种珠子,每种有 aia_i 颗,且美丽值为 viv_i。任意两颗珠子不同(同种类也算不同)。每种珠子有一个漂亮值 viv_i。项链有一个美丽度,若第 ii 种珠子在项链中有 cntcnt 颗并且 cnt1cnt\ge1,则这串项链的美丽度会加上 (vi)cnt(v_i)^{cnt}。求所有不同的项链的美丽度总和是多少。

    Solution

    以下记 S=i=1naiS=\sum\limits^n_{i=1} a_i,且以下式子默认对 109+710^9+7 取模。

    subtask 1

    留给搜索。

    每一颗珠子枚举是否选择,即有 2S2^S 种项链。枚举一下就行。

    时间复杂度 O(2S)O(2^S)

    subtask 2

    开始推式子。

    对于第 ii 种珠子,剩下 SaiS-a_i 颗珠子,有 2Sai2^{S-a_i} 种取法。而在这 ii 颗珠子中,取 xx 颗,美丽值增加 (vi)x{(v_i)}^x。取 xx 颗珠子的方案数为 CaixC^x_{a_i}。所以答案为:

    $$\begin{aligned}\sum \limits _{i=1}^n\sum\limits_{x=1}^{a_i}(2^{S-a_i}\times C^x_{a_i}\times {v_i}^x) &=\sum \limits _{i=1}^n[2^{S-a_i}\times \sum\limits_{x=1}^{a_i}(C^x_{a_i}\times {v_i}^x)] \end{aligned}$$

    时间复杂度 O(SlogS)O(S\log S)。其中 logS\log S 是快速幂的时间复杂度。

    subtask 3

    显然,subtask 2 的时间复杂度会 T 飞。

    外面一层明显无法化简,此时回头看一眼二项式定理:

    $$(a+b)^n=\sum \limits_{i=0}^{n}C^i_n\times a^i\times b^{n-i} $$

    再看看里面那一坨式子:

    x=1ai(Caix×vix)\sum\limits_{x=1}^{a_i}(C^x_{a_i}\times {v_i}^x)

    稍微变下形:

    $$\sum\limits_{x=1}^{a_i}(C^x_{a_i}\times {v_i}^x\times 1^{a_i-x}) $$

    这两个好像!

    所以答案可以变为 $\sum \limits _{i=1}^n[2^{S-a_i}\times (v_i+1)^{a_i}]$?

    由于原式中是从 11 开始遍历的,所以还需要减去 Cai0×vi0×1ai=1C_{a_i}^0\times {v_i}^0\times 1^{a_i}=1

    故答案为 $\sum \limits _{i=1}^n\{2^{S-a_i}\times [(v_i+1)^{a_i}-1]\}$

    时间复杂度 O(nlogS)O(n\log S)

    code

    杜绝复制!

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int a[2000003],v[2000003];
    int qpow(int a,int n,int mod)
    {
        int re=1;
        while(n)
        {
            if(n&1)
                re=(re*a)% mod;
            n>>=1;
            a=(a*a)%mod;
        }
        return re%mod;
    }
    signed main()
    {
    	int n,ans=0,s=0;
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>a[i],s+=a[i];
    	for(int i=1;i<=n;i++) cin>>v[i];
    	for(int i=1;i<=n;i++)
    	{
    		int cnt=0;
    		cnt=qpow(v[i]+1,a[i],1000000007)-1;
    		ans+=cnt*qpow(2,s-a[i],1000000007),ans%=1000000007;
    	}
    	cout<<ans;
    	return 0;
    }
    
    • 1

    信息

    ID
    9675
    时间
    1000ms
    内存
    512MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者