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=lr​f(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)a1​val+a2​(val+1)+a3​(val+2)
  • =a1val+a2val+a2+a3val+2a3=a_1val+a_2val+a_2+a_3val+2a_3=a1​val+a2​val+a2​+a3​val+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(数学,二阶隔项差分)相关推荐

  1. 2019牛客多校训练第十场F Popping Balloons

    2019牛客多校训练第十场F Popping Balloons 题意:二维平面内给你若干个点,然后你可以在x轴和y轴分别射三枪(每一枪的间隔是R),问最多能射掉多少气球. 题解:贪心.这个应该只能算作 ...

  2. 【2020暑假牛客多校(一)】

    牛客多校 Home AC:2,rank517AC : 2, rank517AC:2,rank517 7.127.127.12 题单 F(1271/5027)F(1271/5027)F(1271/502 ...

  3. 2019牛客多校训练营第一场 H题 HOR 题解

    题目描述: 输入描述: 输出描述: 示例1: 题解: 更多问题可关注牛客竞赛区,一个刷题.比赛.分享的社区. 传送门:https://ac.nowcoder.com/acm/contest/discu ...

  4. 2019牛客多校训练营第一场 E题 ABBA 题解

    问题描述: 输入描述: 输出描述: 示例1: 题解: 更多问题可关注牛客竞赛区,一个刷题.比赛.分享的社区. 传送门:https://ac.nowcoder.com/acm/contest/discu ...

  5. [2019牛客多校训练第3场]Median

    链接:https://ac.nowcoder.com/acm/contest/883/I 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  6. 2020牛客暑期多校训练营(第八场)Enigmatic Partition

    题目链接 https://ac.nowcoder.com/acm/contest/5673/E 题目大意 将数 x 拆分,需要满足拆分的数的最大和最小的差值为2,且相邻两个数的差值不能超过1 定义 f ...

  7. 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 ...

  8. 2020牛客暑期多校训练营Enigmatic Partition(数学,二阶隔项差分)

    Enigmatic Partition 题目描述 输入描述: 输出描述: 示例1 输入 3 5 7 7 9 1 9 输出 Case #1: 2 Case #2: 7 Case #3: 8 说明 题目大 ...

  9. 2019牛客暑期多校训练营(第一场) - B - Integration - 数学

    https://ac.nowcoder.com/acm/contest/881/B https://www.cnblogs.com/zaq19970105/p/11210030.html 试图改写多项 ...

最新文章

  1. RxJava repeat,repeatWhen,repeatUntil 的区别
  2. 使用crontab自动化调度jupyter notebook定时运行
  3. php离开界面监听,js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)...
  4. 起底《最后生还者2》:开发者们设计剧情应该规避的误区
  5. CSS3+JS切割轮播图
  6. 从S3中导入数据到Dynamodb
  7. ORACLE 10g EXPDP,IMPDP使用方法
  8. 创邻科技张晨:智能物联为图数据库的迅速发展提供了良好应用场景
  9. 分析redis key大小的几种方法
  10. (转载)Xcode 4.1/4.2/4.3 免证书(iDP)开发+真机调试+生成IPA全攻略
  11. 搭建新环境的准备工作
  12. Java自学学习路线,自学方法,0基础小白如何怎么样才能用最短的时间学好Java
  13. pdf转换成ppt转换器免费版
  14. LiveGBS国标GB/T28181流媒体平台华为IPC设备GB35114配置接入说明
  15. K均值算法(K-means)
  16. win10商店打不开_Win10应用商店出现异常打不开三种解决方法
  17. IIS配置ipa下载设置
  18. matlab 多个向量的余弦角_matlab中怎么求一个行向量的反余弦值
  19. 【中医学】10 针灸-1
  20. 10a大电流稳压芯片_IC芯片大小的完整10A DC/DC电源

热门文章

  1. 安卓Android实现聊天滚动界面
  2. 5分钟理解令人叫绝的认知偏误
  3. 手机与座机号码正则表达式/特殊字符
  4. js中替换指定的字符
  5. php蛇蛇大作战,贪吃蛇大作战
  6. 可变参数传递与不可变参数传递
  7. 基于Python的国际绝对音名标准频率C语言宏定义(32位无符号整型精度、十二等律体系、A4=440.01000Hz)
  8. 如何将本地代码文件上传到阿里云的git上面
  9. java steam collect,Java8 Steam 随笔记录
  10. Hibernate之两种一对一关系映射方式