找回密码
 欢迎注册
查看: 13240|回复: 6

[提问] 关于直线扫描格子问题

[复制链接]
发表于 2008-11-18 23:29:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
有一个n*m(1 <=n,m <=10^6)的格子,在每个格子的中心都有一个人,A在最左下角的格子中,他手中有一把威力很大的枪,一枪可以击中直线上的任何目标,A只能在左下角的格子中,但可以转方向,求其最少开几枪可以将其余n*m-1人打中。 我想了好长时间,感觉与欧拉函数有关,但不知怎么做, 谁有思路,帮下忙。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-11-19 08:25:36 | 显示全部楼层
很暴力
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-11-19 08:29:31 | 显示全部楼层
还没细想。 假定开枪者枪口指向正上方, 则每次顺时针旋转一个最小的角度, 直到此时该枪口上有人存活则扣动扳机。 似乎所费的子弹已足够少了。 换一种策略(也许并不好): 首先应瞄准矩形最外围尚存活的那些人, 由于枪的威力巨大,子弹会顺带干掉矩形内部处在射线上的家伙。 当外围敌人消灭后,矩形就相对瘦了一圈, 继续沿该策略执行下去,就可完成任务。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-11-19 08:34:36 | 显示全部楼层
此问题与以下问题等价: $1 <= x <= n$ $1 <= y <= m$ $x$,$y$ 互素 求 $(x,y)$ 的个数 由欧拉函数的定义: 如果 $N$ 的素因子分解式为 $ N= p_1^{alpha_1}*p_2^{alpha_2}*...*p_t^{alpha_t} $ 则 $phi(N)=$ 小于或等于 $N$ 的数中与 $N$ 互素的数的数目 $=N*(1-1/p_1)*(1-1/p_2)*...*(1-1/p_t) $ 假设 $n<=m$ 则所求数为: $phi(1)+2*(phi(2)+...+phi(n))+phi(n+1)+phi(n+2)+...+phi(m)$ 后面的化简就不会了(离开学校多年,很多东西忘记了 )。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-11-19 08:59:06 | 显示全部楼层
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-11-20 07:48:13 | 显示全部楼层
mathe 在上述链接中给出了非常好的算法。 这里转帖一下: 可以通过一个类似筛选法求素数的算法,计算出所有小于n的数x的不同素因子数目pc[x] 如pc[1]=0,pc[2]=pc[3]=pc[4]=pc[5]=1,pc[6]=2 然后对于每个整数d,我们知道矩形$1 <=x <=n-1,1 <=y <=m-1$中,x,y都是d的倍数的数目是$[(n-1)/d]*[(m-1)/d]$ 我们要算的就是
  1. for(s=0,i=1;i<min(n,m);i++){
  2. if(pc[i]&1){
  3. s-=((n-1)/i)*((m-1)/i);
  4. }else{
  5. s+=((n-1)/i)*((m-1)/i);
  6. }
  7. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-11-20 23:43:07 | 显示全部楼层

回复 6# gxqcn 的帖子

真没想到这个都能被你找到,那个帖就是我发的,但是他的方法在第四个测试点上就错了,还忘指点一下。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-21 23:58 , Processed in 0.024601 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表