hdu4611 Balls Rearrangement,模拟
来源:互联网 发布:maven打包 java.lang 编辑:程序博客网 时间:2024/06/16 16:02
题意:求sum{abs(i%a-i%b)|i=0..n-1},1<=n<=1000000000,1<=a,b<=100000
这题不难,但是我不会。
看了网上的题解,居然是根据lcm暴力模拟。
从0..n-1模拟,找到下一个最近%a=0或%b=0的断点,计算这一段的变化值。
由于这一段差值是一样的,可以一次计算一段的总差值。
为什么暴力可行呢。似乎没有人给出合理解释。
我来研究一下。
n直接取最大值1000000000。
那么当lcm(a,b)比较大时候,说明min(a,b)至少大于10000。
那么这样暴力模拟跳的断点最多只会有O(n/a+n/b),不会大于10^6。
当lcm比较小的时候,利用循环的特点,每lcm个数是一样的。
这样只要暴力跳lcm个数。
此时lcm最大就是a*b,断点最多是O(lcm/a+lcm/b),即O(b+a)。
所以复杂度是可接受的。
这题不难,但是我不会。
看了网上的题解,居然是根据lcm暴力模拟。
从0..n-1模拟,找到下一个最近%a=0或%b=0的断点,计算这一段的变化值。
由于这一段差值是一样的,可以一次计算一段的总差值。
为什么暴力可行呢。似乎没有人给出合理解释。
我来研究一下。
n直接取最大值1000000000。
那么当lcm(a,b)比较大时候,说明min(a,b)至少大于10000。
那么这样暴力模拟跳的断点最多只会有O(n/a+n/b),不会大于10^6。
当lcm比较小的时候,利用循环的特点,每lcm个数是一样的。
这样只要暴力跳lcm个数。
此时lcm最大就是a*b,断点最多是O(lcm/a+lcm/b),即O(b+a)。
所以复杂度是可接受的。
其实这是一种玩数据范围的题。。仔细分析数据之间的关系就好办啦
注意第二种的计算中,(n/lcm) 要先算,否则会爆long long。因此wa两发。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;long long gcd(long long a,long long b){ return b==0?a:gcd(b,a%b);}long long work(long long n,long long a,long long b){ long long au=0,bu=0; long long ret=0,cnt=0,len; while(cnt<n){ len=min(a-au,b-bu); if (cnt+len>n) len=n-cnt; ret+=abs(au-bu)*(len); au=au+len; bu=bu+len; cnt+=len; if (au>=a) au-=a; if (bu>=b) bu-=b; } return ret;}int cas;long long n,a,b,lcm,ans;int Main(){ //freopen("4611in.txt","r",stdin); scanf("%d",&cas); while(cas--){ scanf("%I64d%I64d%I64d",&n,&a,&b); if (a>b) swap(a,b); lcm=a/gcd(a,b)*b; if (lcm>n){ ans=work(n,a,b); } else { ans=work(lcm,a,b)*(n/lcm)+work(n%lcm,a,b); } printf("%I64d\n",ans); } return 0;}
0 0
- hdu4611 Balls Rearrangement,模拟
- Balls Rearrangement(hdu4611,模拟+数学)
- hdu4611 Balls Rearrangement
- hdu4611 Balls Rearrangement
- hdu4611 Balls Rearrangement
- hdu4611 Balls Rearrangement
- hdu4611 Balls Rearrangement(推公式)
- hdu 4611 Balls Rearrangement(数学:推理+模拟)
- Balls Rearrangement
- Balls Rearrangement
- hdu 4611 Balls Rearrangement
- hdu 4611 Balls Rearrangement
- hdu-4611-Balls Rearrangement
- HDU 4611 Balls Rearrangement
- HDU 4611 Balls Rearrangement
- hdu-4611-Balls Rearrangement
- hdu 4611 Balls Rearrangement
- hdu 4710 Balls Rearrangement
- Java动态代理
- db2 删除实例
- 黑马程序员-C语方关于i++和i--的区别
- 【MFC动态创建按钮,并在按钮上实现位图的切换显示】
- java-集合操作
- hdu4611 Balls Rearrangement,模拟
- Android各种资源引用的方法
- 将后台数据传到前台JSON应用
- nyoj90整数划分
- Moo University - Financial Aid(2010)
- html-上左右布局方式---ShinePans
- IQ调制、成型滤波及星座映射
- java 之 IO
- [C语言基础]一些C语言小程序(二)