Description
小包有N个球和A个盒子。球标号为0到N-1,盒子编号为0到A-1。标号为x的球放在下标为x mod A的盒子里。
然后他得到了B个新盒子,编号为0到B-1。他想把所有球从旧盒子里面拿出来放到新盒子,标号为x的球放在下标为x mod B的盒子里。
对于某个球来说,如果原本放在下标为a的旧盒子,现在放在下表为b的新盒子,那么费用为|a-b|。
求出总花费。
Input
输入3个整数N,A和B,同一行。
Output
输出总花费。
Sample Input
输入1:
1000000000 1 1
输入2:
8 2 4
Sample Output
输出1:
0
输出2:
8
Data Constraint
对于30%的数据有1≤N≤20
对于全部数据,有1≤N≤1000000000,A,B≤100000
思路:
这道题有点坑。。。
一开始我就想着处理一个表,大概可以水点分,结果发现MLE,RE,WA。。。
于是我便认真地推起了规律。。。
我们发现,在非倍数交替之间,那一个区间的代价是一样的,于是就可以跳着加,加了这个优化就可以AC啦!!!
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long n,a,b,i=0,x,j=0,k=0,ass=0;
int main()
{
scanf("%lld%lld%lld",&n,&a,&b);
while (1)
{
x=min(a-j,b-k);
if (i+x>n)
{
ass+=(n-i)*abs(j-k);
printf("%lld",ass);
return 0;
}
ass+=x*abs(j-k);
i+=x;j+=x;k+=x;
if (j==a) j=0;
if (k==b) k=0;
}
}