Task 1:最小公倍数

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

 结果对1234567890取模。

【样例输入】

3

【样例输出】

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取模

【样例输入】

3 15

【样例输出】

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取模

【样例输入】

3 2
6 7 8

【样例输出】

6
100002
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. Tyche 2147 旅行

    题目描述 你有m元钱,将要游览n个国家.每一个国家有一种商品,其中第i个国家商品的单价为ai元.每到一个国家,你会用手上的钱疯狂购买这个国家的商品,直到剩余的钱无法购买为止. 现在你要决定游览这n个国 ...

  2. 搭建YUM仓库

    概述 YUM 主要用于自动安装.升级 rpm 软件包,它能自动查找并解决 rpm 包之间的依赖关系.要功的使用 YUM 工具安装更新软件或系统,就需要有一个包含各种 rpm 软件包的 reposito ...

  3. [SCOI2005] 互不侵犯

    传送门:>Here< 解题思路 其实这道题一种很简单的解法是搜索+打表,但是这样很赖皮.这里给出一种状压DP的解法. 很显然利用普通的DP无法解决了,因为针对点来转移是很难的.但看到$N& ...

  4. robotframework用例标签的使用

    *** Settings ***Force Tags req-42Default Tags owner-john smoke *** Variables ***${HOST} 10.0.1.42 ** ...

  5. MT【292】任意存在求最值

    已知向量$\textbf{a},\textbf{b}$满足:$|\textbf{a}|=|\textbf{b}|=1,\textbf{a}\cdot\textbf{b}=\dfrac{1}{2},\t ...

  6. MT【189】二次条件配方

    “当一幢建筑物完成时,应该把脚手架拆除干净.”——高斯 (2017北大特优)若对任意使得关于 \(x\) 的方程 \(ax^2+bx+c=0\)(\(ac\ne 0\))有实数解的 \(a,b,c\) ...

  7. mac上安装ta-lib

    Now I am ready to start installing TA-Lib. Generally I followed the steps listed in here. 1. Install ...

  8. bzoj1014 火星人 (hash+splay+二分答案)

    求公共前缀的问题可以用hash+二分来解决,但这个是动态的,所以我们用平衡树来维护区间的hash值 复杂度$O(mlog^2n)$ #include<bits/stdc++.h> #def ...

  9. LVS搭建负载均衡(二)DR模型

    应用场景:LVS配置负载均衡方式之一:dr 测试环境: 配置步骤: 1. 在主机lvs上安装ipvsadm ~]# yum install ipvsadm -y ~]# ipvsadm //启动:该命 ...

  10. Linux包系列的知识(附:Ubuntu16.04升级到18.04的案例)

    Linux基础:https://www.cnblogs.com/dunitian/p/4822808.html#linux 之前看到朋友还动不动 apt-get update upgrade,就很纳闷 ...