2020暑期牛客多校训练营第八场(E)Enigmatic Partition(数学,二阶隔项差分)
Enigmatic Partition
原题请看这里
题目描述:
数字nnn的分区是所有数字之和等于nnn的集合。
如果分区n=a1+a2+...+amn = a_1 + a_2 + ... + a_mn=a1+a2+...+am满足以下特征,则称为神秘分区:
- aia_iai是整数,1≤ai≤n1 \le a_i \le n1≤ai≤n forforfor 1≤i≤m1 \leq i \leq m1≤i≤m,并且
- ai≤ai+1≤ai+1a_i \leq a_{i + 1} \leq a_i + 1ai≤ai+1≤ai+1表示1≤i≤m1 \leq i \leq m1≤i≤m,并且
- am=a1+2a_m = a_1 + 2am=a1+2
令f(n)f(n)f(n)为nnn的神秘分区的数量。 给定lll和rrr,请计算∑i=lrf(i)\sum_ {i = l} ^ r f(i)∑i=lrf(i)
输入描述:
第一行包含测试用例的数量T(1≤T≤10,000)T(1 \le T \le 10,000)T(1≤T≤10,000)。
在下面的每条TTT行中,都有两个整数lll和r(1≤l≤r≤100,000)r(1 \le l \le r \le 100,000)r(1≤l≤r≤100,000)。
输出描述:
对于每个测试用例,输出一行包含CaseCaseCase #xxx:yyy 的行,其中x是测试用例编号,y是答案。
样例输入:
3
5 7
7 9
1 9
样例输出:
Case #1: 2
Case #2: 7
Case #3: 8
说明:
f(1) = 0.
f(2) = 0.
f(3) = 0.
f(4) = 0.
f(5) = 0.
f(6) = 1: 6 = 1 + 2 + 3.
f(7) = 1: 7 = 1 + 1 + 2 + 3.
f(8) = 2: 8 = 1 + 1+ 1 + 2 + 3, 8 = 1 + 2 + 2 + 3.
f(9) = 4: 9 = 1 + 1 + 1 + 1 + 2 + 3, 9 = 1 + 1 + 2 + 2 + 3, 9 = 1 + 2 + 3 + 3, 9 = 2 + 3 + 4
思路:
考虑差分。
首先,我们观察题目所给的f(n)f(n)f(n)的条件:首项末项相差为二,且相邻数字的差值最多为111的不下降序列。
所以对于每一个这样的序列我们都可以分成三段:
- a1+a2+a3=ma_1+a_2+a_3=ma1+a2+a3=m
- a1,a2,a3≥1a_1,a_2,a_3 \ge 1a1,a2,a3≥1
根据题目意思,我们可以列出下面的等式:
- a1val+a2(val+1)+a3(val+2)a_1val+a_2(val+1)+a_3(val+2)a1val+a2(val+1)+a3(val+2)
- =a1val+a2val+a2+a3val+2a3=a_1val+a_2val+a_2+a_3val+2a_3=a1val+a2val+a2+a3val+2a3
- =val(a1+a2+a3)+a2+2a3=val(a_1+a_2+a_3)+a_2+2a_3=val(a1+a2+a3)+a2+2a3
- =valm+a2+2a3=valm+a_2+2a_3=valm+a2+2a3
- =n=n=n
这里我们可以发现,对于每一个nnn都可以分成444个未知数:val,m,a2,a3val,m,a_2,a_3val,m,a2,a3,其中a2,a3≥1a_2,a_3 \ge 1a2,a3≥1
想到这里,我们就要引入解这题的重要方法————差分
差分用来求解区间加减求和的问题。
实现:对于每一个区间,我们在差分数组上对这个区间的第一个位置加上修改值,最后一个位置减去修改值,再对差分数组求前缀和,那么这个得到的前缀和数组就是最后经过修改的数组。
简单来说,设原数组是a[]a[]a[],差分数组是b[]b[]b[],那么ai=bi−bi−1a_i=b_i-b_{i-1}ai=bi−bi−1
对于差分,还有两个变式:
- 二阶差分
二阶差分其实就是差分里再套一个差分,假设要减去或加上一段有规律的数字,可以对差分数组再进行差分,得到一个二阶差分数组,就可以把有规律的转化成同样的数值。
- 隔项差分
隔项差分就是隔一项差分一次。
介绍完差分,回到本题:
刚刚我们推出了:
valm+a2+2a3=nvalm+a_2+2a_3=nvalm+a2+2a3=n
以下我们以val=1,m=6为例列表分析,设标记数组为fnf_nfn:
n | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
---|---|---|---|---|---|---|---|---|---|---|
a3=4a_3=4a3=4 | 123333 | |||||||||
a3=3a_3=3a3=3 | 112333 | 122333 | ||||||||
a3=2a_3=2a3=2 | 111233 | 112233 | 122233 | |||||||
a3=1a_3=1a3=1 | 111123 | 111223 | 112223 | 122223 | ||||||
位置: | val*m+3 | (val+1)m+1 | (val+1)m+2 | (val+2)m | ||||||
fn:f_n:fn: | 1 | 1 | 2 | 2 | 2 | 1 | 1 | 0 | 0 | 0 |
差分 | 1 | 0 | 1 | 0 | 0 | -1 | 0 | -1 | 0 | 0 |
隔项 | 1 | 0 | 0 | 0 | -1 | -1 | 0 | 0 | 0 | 1 |
所以我们只要枚举valvalval和mmm的值,在区间首尾进行标记,最后变回原来的数组就可以了
比赛的时候想了半天没想到点子上呜呜呜呜
ACACAC CodeCodeCode:
#include<bits/stdc++.h>
#define ll long long
const int MAXN=1e5+10;
ll t,l,r,qian[MAXN<<1],f[MAXN<<2];
int main(){for(int i=3;i<MAXN;++i)for(int j=i;j<MAXN;j+=i){f[j+3]++;f[j+2*i]++;f[j+i+1]--;f[j+i+2]--;}for(int i=3;i<MAXN;++i) f[i]+=f[i-2];for(int i=1;i<MAXN;++i){f[i]+=f[i-1];qian[i]=qian[i-1]+f[i];}scanf("%lld",&t);for(int Case=1;Case<=t;Case++){scanf("%lld%lld",&l,&r);printf("Case #%d: %lld\n",Case,qian[r]-qian[l-1]);}
}
2020暑期牛客多校训练营第八场(E)Enigmatic Partition(数学,二阶隔项差分)相关推荐
- 2019牛客多校训练第十场F Popping Balloons
2019牛客多校训练第十场F Popping Balloons 题意:二维平面内给你若干个点,然后你可以在x轴和y轴分别射三枪(每一枪的间隔是R),问最多能射掉多少气球. 题解:贪心.这个应该只能算作 ...
- 【2020暑假牛客多校(一)】
牛客多校 Home AC:2,rank517AC : 2, rank517AC:2,rank517 7.127.127.12 题单 F(1271/5027)F(1271/5027)F(1271/502 ...
- 2019牛客多校训练营第一场 H题 HOR 题解
题目描述: 输入描述: 输出描述: 示例1: 题解: 更多问题可关注牛客竞赛区,一个刷题.比赛.分享的社区. 传送门:https://ac.nowcoder.com/acm/contest/discu ...
- 2019牛客多校训练营第一场 E题 ABBA 题解
问题描述: 输入描述: 输出描述: 示例1: 题解: 更多问题可关注牛客竞赛区,一个刷题.比赛.分享的社区. 传送门:https://ac.nowcoder.com/acm/contest/discu ...
- [2019牛客多校训练第3场]Median
链接:https://ac.nowcoder.com/acm/contest/883/I 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 2020牛客暑期多校训练营(第八场)Enigmatic Partition
题目链接 https://ac.nowcoder.com/acm/contest/5673/E 题目大意 将数 x 拆分,需要满足拆分的数的最大和最小的差值为2,且相邻两个数的差值不能超过1 定义 f ...
- 2020牛客暑期多校训练营(第八场) Enigmatic Partition
原题 题目描述 样例 输入 3 5 7 7 9 1 9 输出 Case #1: 2 Case #2: 7 Case #3: 8 说明 f(1)=0. f(2)=0. f(3)=0. f(4)=0. f ...
- 2020牛客暑期多校训练营Enigmatic Partition(数学,二阶隔项差分)
Enigmatic Partition 题目描述 输入描述: 输出描述: 示例1 输入 3 5 7 7 9 1 9 输出 Case #1: 2 Case #2: 7 Case #3: 8 说明 题目大 ...
- 2019牛客暑期多校训练营(第一场) - B - Integration - 数学
https://ac.nowcoder.com/acm/contest/881/B https://www.cnblogs.com/zaq19970105/p/11210030.html 试图改写多项 ...
最新文章
- RxJava repeat,repeatWhen,repeatUntil 的区别
- 使用crontab自动化调度jupyter notebook定时运行
- php离开界面监听,js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)...
- 起底《最后生还者2》:开发者们设计剧情应该规避的误区
- CSS3+JS切割轮播图
- 从S3中导入数据到Dynamodb
- ORACLE 10g EXPDP,IMPDP使用方法
- 创邻科技张晨:智能物联为图数据库的迅速发展提供了良好应用场景
- 分析redis key大小的几种方法
- (转载)Xcode 4.1/4.2/4.3 免证书(iDP)开发+真机调试+生成IPA全攻略
- 搭建新环境的准备工作
- Java自学学习路线,自学方法,0基础小白如何怎么样才能用最短的时间学好Java
- pdf转换成ppt转换器免费版
- LiveGBS国标GB/T28181流媒体平台华为IPC设备GB35114配置接入说明
- K均值算法(K-means)
- win10商店打不开_Win10应用商店出现异常打不开三种解决方法
- IIS配置ipa下载设置
- matlab 多个向量的余弦角_matlab中怎么求一个行向量的反余弦值
- 【中医学】10 针灸-1
- 10a大电流稳压芯片_IC芯片大小的完整10A DC/DC电源