Task 1:最小公倍数

 输入n,求n与246913578的最小公倍数。

 结果对1234567890取模。

【样例输入】

  1. 3

【样例输出】

  1. 246913578

【数据规模和约定】

  • 对于30%的数据, n<=10^9
  • 对于100%的数据,n<=10^18
  • 对于100%的数据,n<=10^100000

80分算法:

 可以得到246913578和1234567890具有倍数关系,所以答案只有5种:

  • 246913578*{0,1,2,3,4}

 求最小公倍数可以转化为求最大公约数,也就是:

  • (n*246913578%gcd(n,246913578))%1234567890

 因为乘法会爆longlong,所以我们可以把它转成:

  • 246913578*((n/gcd(n,246913578))%5)

 对解决不了的高精度部分做一个特判0/5处理,再加上一个随机化骗分,80就到手了qwq

正解:

 对于这个高精度数,可以认为它是通过多位数字构造组合起来的数,满足加法原理和乘法原理。

 所以我们只需要每一次获取这个数的一位并取模就可以得到模意义下的这个数,在数字构造的时候直接求gcd取模即可


Task 2:不可逆转

 求有多少1~n的排列满足:这个排列是波动的。

 用a[i]表示排列中的第i个数,波动的意思是,对任意1<=i<=n-2,

 若a[i]<a[i+1],则a[i+1]>a[i+2]

 若a[i]>a[i+1],则a[i+1]<a[i+2]

 答案对m取模

【样例输入】

  1. 3 15

【样例输出】

  1. 4

【数据规模和约定】

  • 对于30%的数据, n<=10
  • 对于60%的数据, n<=100
  • 对于100%的数据, n<=1000,m<=10^9

 这个题目实际上是山东省选的一个原题,原题叫做地精部落,实际上就是求波动数列的个数。

 在原来的题解里面我见过一些非常玄学的解法,实在想不明白,直到看到这个题目的讲解才明白这个题目有更好的想法。

大致思路是这样的:

  • 设计一个状态f[i]表示1-i的排列里面波动数列的个数,然后取出i+1向原数列中插入。
  • 由于上升和下降本质一直,可以对称得到所以只求一个方向就可以。
  • 由于每个数不同,最大值左右两边数列(大小为k-1和n-k)可以离散化为[1,k-1][1,n-k]两个已解决数列。
  • 对一个确定的数列方案数为f[k-1]*f[ n-k ]。其间数字可以互换,考虑在n-1个数里拆出这两个数列的方案数,为C(k-1,n-1)。
  • 可以得到对于每一个位置k,方案数为f[k-1]*f[n-k]*C(k-1,n-1),总方案数就是f[n]=Σ(k为奇数/偶数)f[k-1]*f[n-k]*C(k-1,n-1)了

嗯,写起来相当简单,但思考起来就不是了。


Task 3:数值微分

【问题描述】

 在数学中,对光滑函数求微分是一种常见的操作。在实际应用中,一些函数没有解析形式,通常会从函数上取若干个点,用这些点来近似地表示这个函数。

 现在有一个函数f(x),我们在函数上取n个值f(1),f(2),…,f(n)。对函数f(x)取微分得到函数f’(x)。我们近似地认为f’(i)=f(i)-f(i-1)。

 同理,对f’(x)求微分可以得到f’’(x),我们近似地认为f’’(i)=f’(i)-f’(i-1)。(注意这里的f’(i)和f’(i-1)本身就是我们求的近似值)。

 函数f’(x)被称为一阶微分,f’’(x)被称为二阶微分。如果对函数f(x)连续做m次微分操作,得到的函数被称为m阶微分。特殊地,f(x)可以被认为是自身的0阶微分。

 用f[m](x)表示f(x)的m阶微分,我们认为对任意自然数m,有f[m](0)=0。在计算近似值时,直接使用这条性质。

 现在,给出f(1),f(2),…,f(n),以及m。,求f[m](1), f[m](2),…, f[m](n)。

 把上面所说的内容说的清楚一点,输入的是f(1),f(2),…,f(n):

  • 令f[0](x)=f(x),x=1,2,…,n
  • 令f[i](0)=0,i=0,1,…m
  • 令f[i](x)=f[i-1](x)-f[i-1](x-1), x=1,2,…,n, i=1,2,…,m
  • 输出的是f[m](x) ,x=1,2,…,n

【输入格式】

  • 第一行两个数n,m

  • 第二行n个数f(1),f(2),…,f(n)

【输出格式】

  • 输出n行,第x行是f、m

  • 结果对100007取模

【样例输入】

  1. 3 2
  2. 6 7 8

【样例输出】

  1. 6
  2. 100002
  3. 0

【数据规模和约定】

  • 对于30%的数据, m<=1000
  • 对于60%的数据, m<=10^6
  • 对于100%的数据, n<=1000,m<=10^9,0<=f(i)<100007

 题目意思其实蛮简单的,就是求f[ i ][ j ]=f[ i-1 ][ j ]-f[ i-1 ][ j-1 ],一个类似于杨辉三角的递推。

 经过手推我们会发现其实所谓m阶微分就是(a-b)m的多项式展开,也就是求Σ(-1)i*C( m , i )。

 想到这里就不难处理了,但是紧接着的问题还有一个,就是应该怎么求组合数。

 对于这个题目,m和n的范围差距悬殊,而且无论怎么样单次计算组合数都会超时。考虑到组合数较大项一定为m,较小项范围为[ 1 , n ],且n的范围为1000,m的范围为1000000000,我们需要用一种高效的求法。

 先复习一下组合数的求法有哪些吧。

  •   硬算 单次O( max( n , m ) )
  •   阶乘逆元求法 适用于多次查询,复杂度预处理O( nlogn ),查询接近O( 1 ),但是模数必须是质数。(100007不是质数)
  •   杨辉三角递推求法 适用于多次密集小范围查询,复杂度预处理O( n^2 ),查询O( 1 )
  •   费马小定理/exgcd求逆元 单次O( n+logn ),是最简单的方法,模数必须为质数
  •   阶乘分解求逆元 适用于高精度组合数计算,或者模数不为质数的求法。复杂度预处理O( nlogn ),查询O( 1 )

 虽然写起来稍微有点麻烦,但阶乘分解确实是唯一可行的方法了。所以基础打牢还是相当重要的啊QWQ

【清北学堂2018-刷题冲刺】Contest 1的更多相关文章

  1. 2017 清北济南考前刷题Day 7 afternoon

    期望得分:100+100+30=230 实际得分:100+100+30=230 1. 三向城 题目描述 三向城是一个巨大的城市,之所以叫这个名字,是因为城市中遍布着数不尽的三岔路口.(来自取名力为0的 ...

  2. 2017 清北济南考前刷题Day 1 afternoon

    期望得分:80+30+70=180 实际得分:10+30+70=110 T1 水题(water) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK出了道水 ...

  3. 2017 清北济南考前刷题Day 3 morning

    实际得分:100+0+0=100 T1 右上角是必败态,然后推下去 发现同行全是必胜态或全是必败态,不同行必胜必败交叉 列同行 所以n,m 只要有一个是偶数,先手必胜 #include<cstd ...

  4. 2017 清北济南考前刷题Day 3 afternoon

    期望得分:100+40+100=240 实际得分:100+40+100=240 将每个联通块的贡献乘起来就是答案 如果一个联通块的边数>点数 ,那么无解 如果边数=点数,那么贡献是 2 如果边数 ...

  5. 2017 清北济南考前刷题Day 4 afternoon

    期望得分:30+50+30=110 实际得分:40+0+0=40 并查集合并再次写炸... 模拟更相减损术的过程 更相减损术,差一定比被减数小,当被减数=减数时,停止 对于同一个减数来说,会被减 第1 ...

  6. 2017 清北济南考前刷题Day 7 morning

    期望得分:100+50+20=170 实际得分:10+50+20=80 1. 纸牌 题目描述 在桌面上放着n张纸牌,每张纸牌有两面,每面都写着一个非负整数.你的邪王真眼可以看到所有牌朝上的一面和朝下的 ...

  7. 2017 清北济南考前刷题Day 6 afternoon

    期望得分:100+100+30=230 实际得分: 正解: 枚举最高的位,这一位m是1但实际用了0 然后剩余的低位肯定是 正数就用1,负数用0 考场思路:数位DP #include<cstdio ...

  8. 2017 清北济南考前刷题Day 6 morning

    T1 贪心 10 元先找5元 20元 先找10+5,再找3张5 #include<cstdio> using namespace std; int m5,m10,m20; int main ...

  9. 2017 清北济南考前刷题Day 5 afternoon

    期望得分:100+100+30=230 实际得分:0+0+0=30 T1 直接模拟 #include<cstdio> #include<iostream> using name ...

  10. 2017 清北济南考前刷题Day 5 morning

    期望得分:100+100+0=200 实际得分: 坐标的每一位不是0就是1,所以答案就是 C(n,k) #include<cstdio> #include<iostream> ...

随机推荐

  1. Bootstrap之网格类

    代码: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8 ...

  2. jQuery 获取url中的参数

    //获取url中的参数 function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "= ...

  3. Vuex的API文档

    前面的话 本文将详细介绍Vuex的API文档 概述 import Vuex from 'vuex' const store = new Vuex.Store({ ...options }) [构造器选 ...

  4. JarvisOJ BASIC -.-字符串

    请选手观察以下密文并转换成flag形式 ..-. .-.. .- --. ..... ..--- ..--- ----- .---- ---.. -.. -.... -.... ..... ...-- ...

  5. BZOJ2616 SPOJ PERIODNI(笛卡尔树+树形dp)

    考虑建一棵小根堆笛卡尔树,即每次在当前区间中找到最小值,以最小值为界分割区间,由当前最小值所在位置向两边区间最小值所在位置连边,递归建树.那么该笛卡尔树中的一棵子树对应序列的一个连续区间,且根的权值是 ...

  6. Mysql partition by

    一,看原表 select * from `user`; 二,查询同组年级最大的 select username ,SUBSTRING_INDEX( GROUP_CONCAT(age order by ...

  7. HDU4035 Maze 【树形DP】【期望DP】

    题目分析: 以前一直不会这个方法, 我好菜啊. 转移分为三个部分,一个是直接成功,一个是转移到E1,还有一个是转移到自己周围的一圈儿点. 如果是叶子那么只能转移到父亲,如果不是叶子可以把非叶子的转移代 ...

  8. 基于FPGA的数字秒表(数码管显示模块和按键消抖)实现

    本文主要是学习按键消抖和数码管动态显示,秒表显示什么的,个人认为,拿FPGA做秒表真是嫌钱多. 感谢 感谢学校和至芯科技,笔者专业最近去北京至芯科技培训交流了一周.老师的经验还是可以的,优化了自己的代 ...

  9. 【Nowcoder71E】组一组(差分约束,最短路)

    [Nowcoder71E]组一组(差分约束,最短路) 题面 Nowcoder 题解 看到二进制显然就直接拆位,那么区间的按位或和按位与转成前缀和之后,可以写成两个前缀和的值的差的大小关系,那么直接差分 ...

  10. luogu2282/bzoj1219 历史年份 (dp+hash+二分+线段树)

    luogu1415 拆分数列的加强版 先考虑弱化版怎么做 设f[i]表示某一串数,最后一个数的右端点是i时,它的左端点的最大值(也就是说,这一串数的最后一个数尽量小) 那么有$f[j]=max\{i+ ...