中秋节欢乐赛题解
比赛地址分别为:
中秋节欢乐赛DIV1
中秋节欢乐赛DIV2
所有比赛标程、数据都放置在了Github
DIV1
作业计数
小凡一门学课的作业不做怒气总值增加b,那么a门作业不做怒气值即为a×b,答案为对m取膜的结果。
数据范围为1≤a,b,m≤1018,此时你发现a×b会直接炸int。所以需要一些玄学的优化。
Ps:很抱歉,这题没给部分分。
方法一
使用自带高精度的python解决问题
1 2 3 4
| a=int(input()) b=int(input()) m=int(input()) print(a*b%m)
|
方法二
使用高精度的乘法和魔法
在这里推荐各位到yali_hzy的博客看看。我就不写了。。
高精取膜的方法为:
a−b×⌊ba⌋
方法三
用快速乘的方法。
原理类似于卡速米。
1 2 3 4 5 6 7 8 9 10
| #define ll long long ll mul(ll a,ll b,ll m) { ll ans=0; while(b) { if(b&1) b=(b+a)%m; a=(a+a)%m; b>>=1; } return ans; }
|
复杂度为Θ(logb)
月饼采购
这可以算是一个非常经典的题目了,紫书、蓝书上都有。
和作业计数类似的,膜术可以这么算a−b×⌊ba⌋
那么就可以得到以下推导
ans=i=1∑nk−i×⌊ba⌋=n×k−i=1∑ni×⌊ik⌋
然后可以从⌊ik⌋出发,得到答案。
复杂度为Θk。
分配月饼
Cnm=m!(n−m)!n!=∏i=1m∏i=n−mn
得到了以上的结论后即可做到在Θ(2×m),的复杂度内求解。
而原题的n≤2×105,因此可以通过。
值得一提的是,在做除法意义下的膜法时,需要用到逆元。
DIV2
Ps:早知道就用OI赛制了,这样Imakf就不能AK了。
价格统计
直接依照题意模拟即可,把细节把握好。
月光计算
这是一道非常简单的数学题。
n行,n−1列的星星加上一行不少于1的星星肯定是要大于(n−1)2颗星星的。
{y1y2=n(n−1)+1=n2−n+1=(n−1)2=n2−2n+1
所以可以得出y1>y2。答案即为n2,不过记得开long long
月饼管理
提示中的数据结构是前缀和。
您可以参考我的这篇文章。
这里就不多累赘了。