首页 > 其他分享 >[YDOI R1] Necklace 题解

[YDOI R1] Necklace 题解

时间:2024-10-18 08:50:27浏览次数:1  
标签:limits int 题解 sum YDOI times 珠子 Necklace 复杂度

题目传送门

前置芝士

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

Meaning

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

Solution

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

subtask 1

留给搜索。

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

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

subtask 2

开始推式子。

对于第 \(i\) 种珠子,剩下 \(S-a_i\) 颗珠子,有 \(2^{S-a_i}\) 种取法。而在这 \(i\) 颗珠子中,取 \(x\) 颗,美丽值增加 \({(v_i)}^x\)。取 \(x\) 颗珠子的方案数为 \(C^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(S\log S)\)。其中 \(\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} \]

再看看里面那一坨式子:

\[\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}]\)?

由于原式中是从 \(1\) 开始遍历的,所以还需要减去 \(C_{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(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;
}

标签:limits,int,题解,sum,YDOI,times,珠子,Necklace,复杂度
From: https://www.cnblogs.com/SLMXF/p/18473408

相关文章

  • Codeforces Round 893 (Div. 2)题解记录
    题目链接:https://codeforces.com/contest/1858A.Buttons从自身角度出发,我想赢就得保证我的按钮尽可能多所以,大家都优先按\(c\),然后分析先后顺序即可 #include<iostream> #include<string.h> #include<map> #include<vector> #include<set> #include<unordered_set> #......
  • [ABC134F] Permutation Oddness 题解
    [ABC134F]PermutationOddness题解朴素的想法显然是状压dp,枚举选择的子集,但复杂度不可接受。考虑优化。注意到对于\(p_i\),它的贡献只会有两种可能性,\(+p_i,-p_i\)。于是初步的想法是按照\(p_i\)的正负性选择分类。考虑到对于相同正负性的选择\(p\),其是等价的。于是我们......
  • P4229 某位歌姬的故事 题解
    P4229某位歌姬的故事题解\(n\le9\times10^8\),显然复杂度不与\(n\)相关。\(m\le500\),显然可以接受\(O(Tm^2)\)的做法。对于\([l,r]\),考虑套路地将端点离散化,使得复杂度只和关键点个数有关。考虑对于\([l,r,m]\),离散化后被分成了\(a_1,a_2,\cdots,a_p\)段,那么这些段的......
  • ZZJC新生训练赛第四场题解
    ZZJCACM新生训练赛-2024.10.16题目难度Easy(简单):B,C,D,GMedium(中等):A,EAnti-AK(防AK):EC题解题思路A页既可以是彩印也可以是黑白印,B页只能是彩印,所以只要比较A页彩印和A页黑白印的价格高低就好。因为a,b,x,y最大都是1e9,用int直接相乘的话会爆掉,所以......
  • DMA连续发送多帧但是只有最后一帧数据发出问题解决方法
    问题描述DMA连续发送多帧但是只有最后一帧数据发出原因分析DMA发送未完成时,下次DMA请求启动,导致之前的数据被放弃传输了解决办法创建DMA发送缓冲区,当启动DMA请求的时候,检测DMA设备是不是正在忙,如果正在忙,就把数据放入发送缓冲区等待,上次DMA发送完成的时会产生DMA发送完......
  • 【学校训练记录】10月个人训练赛3个人题解
    A:根据题意我们可知,第一种事件为从1到i的和,第二种事件为从y到i的和故我们可以通过前缀和来保存从i到i+1所化的时间。再遍历寻找最小值即可#include<bits/stdc++.h>#defineendl"\n"#defineintlonglongusingnamespacestd;intn,a[1010];voidsolve(){ cin>>n;......
  • 题解:GZOI2024 D2T2 乒乓球
    考场上切了,但是比较神奇的题,应该是蓝/紫。Discription乒乓球\(\text{}\)时间限制:\(\bold{3}\)秒众所周知,一场乒乓球比赛共有两个玩家\(A\)和\(B\)参与,其中一场比赛由多局比赛组成,而每局比赛中又由多盘比赛组成。每盘比赛\(A\)或\(B\)只有一名选手获胜。当其中一名......
  • [题解]P1311 [NOIP2011 提高组] 选择客栈
    P1311[NOIP2011提高组]选择客栈P6032选择客栈加强版只要\([l,r]\)区间之内存在一个\(i\)使得\(w[i]\lep\),这个区间就是符合条件的。所以我们遍历每一个元素\(i\),根据贪心的思想我们维护\([1,i]\)区间内满足\(w[i]\lep\)的最大\(i\),记为\(mp\)。对于每个元素\(i\),寻找\(......
  • 【题解】twt studio2024 萌新欢乐赛
    迟来的题解本文更新到个人主页中,后续如果有任何修正变动也只会在网页端更新~特别鸣谢小羽毛在羽猫球一题的题解:)感谢兴航学弟在T3的题解。比赛链接:https://www.luogu.com.cn/contest/196515T1签到题,所有参与选手均满分。略。T2https://www.luogu.com.cn/article/37n1idam......
  • P9731 [CEOI2023] Balance 题解
    首先考虑\(S=2\)怎么做,我们把它转化为图论问题。对于每一行的两个点的颜色连一条无向边,那我们相当于要给这些边定向。最后要求\(|in_u-out_u|\le1\)。会发现这个要求很像欧拉回路。但是欧拉回路是要求每个点的入度和出度相等,怎么办呢?我们再建一个超级源点,向每个奇数度数的点......