[COCI2009-2010#1] ALADIN

题目描述很简单,就是要求我们计算 ∑ i = 1 n i × A   m o d   B \sum\limits_{i=1}^ni×A\ {\rm mod}\ B i=1ni×A mod B,但是仔细思考会发现 ∑ i = 1 n i × A   m o d   B ≠ ( ∑ i = 1 n i × A )   m o d   B \sum\limits_{i=1}^ni×A\ {\rm mod}\ B≠\left(\sum\limits_{i=1}^ni×A\right)\ {\rm mod}\ B i=1ni×A mod B=(i=1ni×A) mod B,但是根据取模的实质可以知道 ∑ i = 1 n i × A   m o d   B = ∑ i = 1 n i × A − ∑ i = 1 n ⌊ i × A B ⌋ × B \sum\limits_{i=1}^ni×A\ {\rm mod}\ B=\sum\limits_{i=1}^ni×A-\sum\limits_{i=1}^n\left\lfloor\frac{i×A}{B}\right\rfloor×B i=1ni×A mod B=i=1ni×Ai=1nBi×A×B,现在的问题就是如何求出 ∑ i = 1 n ⌊ i × A B ⌋ \sum\limits_{i=1}^n\left\lfloor\frac{i×A}{B}\right\rfloor i=1nBi×A,下面将给出应该能看懂的推导。

本题难在求公差为1的等差数列乘一个数再除以一个数向下取整的和,写成公式:

∑ i = 1 n ⌊ i × q p ⌋ \sum_{i=1}^n\left\lfloor\frac{i×q}{p}\right\rfloor i=1npi×q

直接变换公式好像没什么用,那么我们就尝试将其转换到笛卡尔坐标系中来看(不要问怎么想到的,这是别人给我讲的,应该是一个技巧吧),那么对于一个点 ( i , i × q p ) (i,\frac{i×q}{p}) (i,pi×q) ⌊ i × q p ⌋ \left\lfloor\frac{i×q}{p}\right\rfloor pi×q的值就转换成了点 ( i , 0 ) (i,0) (i,0)到点 ( i , i × q p ) (i,\frac{i×q}{p}) (i,pi×q)之间有多少个整点。那么对于给定的 n , q , p n,q,p n,q,p,答案就变成了求出由直线 y = q p x , x = n , y = 0 y=\frac{q}{p}x,x=n,y=0 y=pqx,x=n,y=0三条直线所围成的一个直角三角形中有多少个整点( y = q p x , x = n y=\frac{q}{p}x,x=n y=pqx,x=n上的整点也要计入答案, y = 0 y=0 y=0上的整点不计入答案),例如当 n = 4 ,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值