题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4706
以前做过的题目: i从0到n-1时,如果一个一个加会很慢,注意到如果mod a的序列 和mod b的序列都处在上升中,那么差距是一样的,这样跳的step就可以大一些~
注意下就是如果a,b都是1的话 ,跳步还是没有变动,直接特判为0就行。 还有step*(i%a-i%b)可能会超int 其中一个要用long long 存放
代码:
#include<iostream>
#include<cmath>
using namespace std;
int min(int a,int b)
{
if(a<b) return a;
else return b;
}
int main()
{
int T,n,a,b;
cin>>T;
while(T--)
{
cin>>n>>a>>b;
if(a==b) cout<<0<<endl;
else
{
long long ans=0;
long long step=1;
for(int i=0;i<n;i+=step)
{
int stepa=a-i%a;
int stepb=b-i%b;
step=min(stepa,stepb);
long long dis=abs(i%a-i%b);
if(i+step>=n)
{
dis=dis*(n-i);
}
else
{
dis=dis*step;
}
ans+=dis;
}
cout<<ans<<endl;
}
}
}