2013 ACM/ICPC Asia Regional Online —— Warmup1 1005 Balls Rearrangement
题目地址: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; } } }