http://acm.hdu.edu.cn/showproblem.php?pid=4710
【题意】
给出n,a,b三个值,求sum( | i%a - i%b | ) ,i属于【0,n-1】
【分析】
由于n值可达1e9,故不能直接循环累加。通过写出一些例子可看出,累加时,总是一段一段相同的值,直接累加 个数*数值,再跳过这些数即可。
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){while(b^=a^=b^=a%=b);return a;}
ll T,a,b,n;
ll cal(ll n)
{
ll ans=0;
for(ll i=0;i<n;)
{
ll add=min(n-i,min(a-i%a,b-i%b));
ans+=abs(i%a-i%b)*add;
i+=add;
}
return ans;
}
int main()
{
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld%lld",&n,&a,&b);
ll lcm=a*b/gcd(a,b);
ll ans=cal(n%lcm);
if(n>=lcm)ans+=n/lcm*cal(lcm);
printf("%lld\n",ans);
}
}