几道有趣的思维题

这篇博客探讨了三道有趣的数学与算法问题:1. 在1到n中选取数使乘积为最大完全平方数的策略;2. 计算给定数列区间内平均值在特定范围内的概率;3. 解决多次折叠纸条后的长度计算。通过巧妙的思路和算法分析,展示了如何高效地解决这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

problem 1

从1~n里选出一些数乘起来构成完全平方数,求能得到的最大完全平方数,结果对1e9+7取模,n<=106

思路

如果从判断哪些能选这个角度来做这个题那么就会陷入死胡同,不妨看哪些不能选,把n!表示成小于等于n的质数的幂的乘积,然后对于幂为奇数的,需要去掉一些数让它的幂变成偶数,怎么去呢?去掉这个质数就ok。那么问题就是对于n!=pc11pc22...pctt统计每个ci的大小(奇偶)。
对于一个pi的每一个pki(1<=k<=c1),求[1<=x<=n][gcd(x,pki)=pki],而它等于npkinpk+1i,所以ci=k(npkinpk+1i)[pki<=n],复杂度为O(nlognlogn)=O(n)

problem 2

给n个数a1~an和L,R,随机选择一个区间[l,r](l<=r),求区间中数的平均值在[L,R]之间的概率,n<=106

思路

实际上就是求区间平均值在[L,R]之间的个数。而[L<=x<=R]=[1<=x<=R][1<=x<=L1],求区间平均值小于等于某个数R的区间个数即可。把所有数都减去R,转化为求区间和小于等于0的区间个数。令sum0=0sumi=ak[1<=k<=i]那么就是求满足sumj>=sumi0<=j<i<=n,而这个可以利用平衡树在O(nlogn)的时间内求出来。更好的办法是将所有的sum排序,然后用双指针快速统计,复杂度O(n)

problem 3

有一张长度为n的纸条,从左至右编号为0~n,给出m个数,表示每次折叠的位置,求经过m次折叠后纸条的长度。n<=1018m<=1000

思路

每折叠一次,对纸条重新编号,然后更新长度和后续未完成的折叠位置在新的编号规则下的编号。这样复杂度为O(m2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值