好题汇总(持续更新)

1. hdoj 4549 M斐波那契数列 【矩阵快速幂 + 费马小定理 + 快速幂】

 简单题意:

M斐波那契数列F[n]是一种整数数列,它的定义如下:
F[0] = a;F[1] = b;F[n] = F[n-1] * F[n-2] ( n > 1 )
现在给出a, b, n,求出F[n]的值。

正解思路:

先用矩阵快速幂求解,再用费马小定理对求解出来的数值优化,最后快速幂求解最终答案。

详细链接:

https://mp.csdn.net/mdeditor/101173703#           

https://blog.csdn.net/chenzhenyu123456/article/details/48602769

 2. hdoj 4869 Turn the pokers 【组合数 + 逆元】【费马小定理—逆元】

简单题意:

有m张牌,1代表牌是面朝上的,0代表牌是面朝下的,初始默认牌都是朝下的,现在有n次操作,每次操作都会翻转数目为x(1 <= x <= m)的牌这也意味着要改变它的状态。问你n次操作后,m张牌的最后状态有多少种?
也就是有一个长度为m的01串,起始为0,每次操作都会使某个位置的数取反,问最后状态可能种数。

正解思路:

讨论1个数的奇偶,组合数求解,在求解组合数的时候费马小定理优化。

详细链接:

https://blog.csdn.net/libin56842/article/details/38065951

https://blog.csdn.net/a601025382s/article/details/38047129

3. hdoj 1695 GCD 【容斥原理 + 欧拉函数】

简单题意:

求出[a,b]和[c,d]区间里面gcd(x,y)=k的数的对数。

正解思路:

将区间进行转化,转化为[a/k,b/k],[c/k,d/k],由题意可以转化为[1,n],[1,m],不妨设n<m,则可以利用欧拉函数,将[1,m]分成[1,n]和[n+1,m]两部分,第一部分转化为https://blog.csdn.net/zhang20072844/article/details/8108727,第二部分利用容斥定理,累加即可。

也可以用莫比乌斯反演做,但是我太菜了,目前还不会。可以看第二个网址。

详细链接:

https://blog.csdn.net/chenzhenyu123456/article/details/46443305

https://blog.csdn.net/my_sunshine26/article/details/73850529

4. BZOJ2186]沙拉公主的困惑(求1-N!中与M!互质的数的个数)

简单题意:

求1~N!中与M!互质的数的个数,其中M<=N。

正解思路:

分析:先考虑1~n中与n互质的数的个数,即为欧拉函数;再考虑1~n中与m互质的个数,如果有n%m==0,则有n/m*Euler(m);如果m>n,则转化为上一个题目,欧拉函数加容斥定理;再考虑1~n中与n互质的数的和为n*Euler(n)/2;回到这个题,可以看到M<=N,那么有M!|N!成立,可以代入上面这种情况中:1~n中与m互质的个数,如果有n%m==0,则有n/m*Euler(m),推出规律即可。

详细链接:

https://blog.csdn.net/Z_sea/article/details/88769269

https://blog.csdn.net/Rain722/article/details/71023456

5.hdoj 5505 GT and numbers 【判断一个数 能否通过累乘因子得到另一个数】

简单题意:

给你两个数N和M,每次操作——N可以乘上它的一个因子变成新的N。问你N能否经过一些操作得到M,若可以输出最少操作次数,否则输出-1。

正解思路:

当N乘某个数之后与M互质或者大于M,这时一定不满足条件,直接跳出,否则就累加。写这个题的原因,M数值要用unsigned long long。

详细链接:

https://blog.csdn.net/chenzhenyu123456/article/details/49209725

6.2019年女生赛C

简单题意:

给定m,n,有n个正整数xi加和等于m,给定n个a,b,c,构造xi值并使n个方程a*xi*xi+b*xi+c的和最小,并求出其和。

正解思路:

把m个数看作m个1,先把n个xi每个都赋成1(因为要保证正整数),然后把剩余的m-n个1进行分配使得得到的和最小,每次求一个集合中的最小值,把所有的元素放入一个优先队列中,然后每次取队顶。在处理的时候每次储存的数值都是增量(当前xi增加1后得到的函数增加值),即a*(xi+1)*(xi+1)+b*(xi+1)-a*xi*xi-b*xi,每次取最小值。

详细链接:

https://blog.csdn.net/qq_43083173/article/details/95912455

7.Codeforces 557D Vitaly and Cycle 【染色判二分图 + 组合数学】

简单题意:

给定一个无向图,问你最少增加多少条边可以得到一个奇环,求方案数。

正解思路:

关于图论了解的还是比较少的,但是感觉这个题还不错,也比较像之前遇到好几次的判断环的题。

分情况讨论,先判断有几条边,形成奇环的只要保证三条边就可以。而关于奇环和判断二分图又有直接的联系。

1.无边时,只要保证选择三个点连接就可以了,需要三条边,总个数就是c(n,3); 
2.不存在大于两个边的点时,假设两个点连在一起的个数是m个,则这两个点,再加上任意别的一个点可以组成一条奇边环,最大只要加二条边,方案数是m * (n-2); (判定连接的边数只需要判断每个点的出度)
3.存在三个点以上的图,这样的图如果存在奇环,那么不要加边答案就是0,1,判定奇环只要保证不能构成二分图,所有只要dfs,染色成x y集合,如果能构成二分图,说明没有奇环,答案就是sum(c(x,2)+ c(y,2)),也就是在x集合任选两点连一条边构成奇环,y集合任选两点连一条边构成奇环。 

详细链接:

二分图相关链接:

https://blog.csdn.net/qq_36345036/article/details/76977294

https://www.cnblogs.com/alihenaixiao/p/4695298.html

https://blog.csdn.net/thunderMrbird/article/details/52231639

本题链接:

https://blog.csdn.net/chenzhenyu123456/article/details/51211458

8.Codeforces 554C Kyoya and Colored Balls 【dp + 组合数学】

简单题意:

有k种颜色,每种颜色有ci个球,要求第i种颜色的最后一个球的后面必须是第i+1种球(也就是涂完第i+1种球之前第i种球已经被涂完),求满足条件的分配方案数。

正解思路:

第一种从后往前递归求解:

按照要求,最后一个位置一定是最后一种球(假设最后一种球ck个,球总数为n个)的某一个,剩下的ck-1个在n-1个位置任意排列,依次往前推,可以理解为将已经排好的删去,倒数第二种球现在可以理解为最后一种,最后把每种情况数相乘即为总的方案数。

第二种可以用dp处理:

状态转移方程:(对第x种颜色的气球进行排列,和前x-1种气球方案数相乘)

dp[x][y]表示只考虑前x种颜色的气球,且当前最后一个气球在位置y上的方案数,sum数组表示第x种气球的个数。
可以得到dp[x][y] = C(y-1, sum[x]-1)*dp[x-1][y-sum[x]]

dp[i]表示前i种气球的方案数,已经涂了前i-1种颜色的球,其中前i-1的方案数为dp[i-1],并且前i-1中颜色的球的总数是presum,这个时候我们要涂第i中颜色的ci个球,这就相当于把ci-1个球插入到presum个球中间去,并且把最后一个放到最后,则状态转移方程为dp[i] = dp[i-1] * C(ci-1+presum,ci-1)

详细链接:

https://blog.csdn.net/yanghui07216/article/details/51213183

https://blog.csdn.net/mengxiang000000/article/details/53611605

https://blog.csdn.net/hzh_0000/article/details/46653105(dp)

9.Codeforces 615D Multipliers 【组合数学】

简单题意:

给定m个质因子p[],有p[1]*p[2]*...*p[m] == n,求解n所有因子的乘积 % 1e9 + 7。

正解思路:

已知所有的质因子,假设m个质因子中总共有k个互异质因子,第i个质因子有xi个。现要计算n的所有因子的乘积,而n的因子是由质因子组合得到的,因此可以计算每个质因子的贡献值,计算k个不同的质因子相乘,从而得到最后所有因子的乘积。

现计算第i个质因子的状态,对于当前质因子有取和不取两种情况,(用数组 l[ ]记录1-i的组合方案数,r[ ]记录i+1-k的组合方案数),如果不取则l[i-1],如果取则为l[i-1]*x[i],则得到l[i]=l[i-1]+l[i-1]*x[i]=l[i-1]*(x[i]+1);同理求出r[ ]。

现计算第i个质因子的状态值,那么与前后的组合方案数为l[i-1]*r[I+1],考虑第i个数本身有xi个,可以取1个,2个,xi个·,最后为等差数列求和(xi+1)*xi/2*l[i-1]*r[i+1]。最后把k个累乘即可。

还有另外一种理解方式:

对于一个数n,有因子x,则一定会有因子n/x,已知因子数后可以求得n所有的因子个数,从而可以得到n所有因子的乘积为n^因子个数/2。因为数据太大要拆开运算,可以分解成每一个质因子。

因子个数和上一种方法都要用到费马小定理优化a^n = a^(n%(m-1)) (%m)。

注意,一般取模运算尤其是幂次增长很有可能用到费马小定理,当然欧拉函数也是有可能的。

详细链接:

https://blog.csdn.net/PhyCode/article/details/51062174

https://blog.csdn.net/chenzhenyu123456/article/details/50486219

10.洛谷P3200 [HNOI2009]有趣的数列

简单题意:

一个长度为2*n的序列,满足:奇数项和偶数项都呈递增状态,相邻的两项,后面的偶数项大于奇数项,求满足条件的序列方案数modp。

正解思路:

卡特兰序列。

分析:保证奇数项小于偶数项,并且有偶数项和奇数项都为递增序列,对于当前位置,前面的奇数项个数一定不会小于偶数项个数。从而可以转化为进栈出栈或者是01序列。

说明奇数项个数不会小于偶数项个数:

反证法:假设有对于2p+1来说刚好偶数位比奇数位多一个,这么最新放的偶数位就是第p+1个,这个偶数位在原来位置就会是2p+2,可是2p+2至少要放一个不小于2p+2的数(因为偶数项都是递增的,并且偶数项大于奇数项,所以每个偶数项的数都会不会小于当前位置)。。。问题是我们才放到2p+1,所以这种情况不可能有解。

知道卡特兰数之后,这道题还有个坑,mod的数不一定是质数,无法用逆元处理除法运算。

预处理出1~2*n的质因子,用线性筛预处理求出每个数的最小质因数,然后约分之后使用快速幂处理。

详细链接:

https://www.luogu.org/problemnew/solution/P3200

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值