2020ICPC沈阳I - Rise of Shadows

剩余系

Problem - I - Codeforces

题意

给定 H,M,A

2<=H,M<=109,0<=A<=HM2

假设一个钟表有 H 小时,一小时有 M 分钟,求一天中有多少整数分钟,满足时针、分钟夹角不超过 2πAHM

思路

  1. 时针角速度:vh=2πHM,分针角速度: vm=2πM

  2. t 分钟时 (vmvh)t2πAHM(modHM)

    (H1)tA(modHM), 求有多少个 t 满足 (H1)tmod(HM)<=A

  3. axb(modm) 中,令 g=gcd(a,m)

    x[0,m1],在模 m 意义下 axg 轮循环,每轮有 0,a,2a...mg+1 种取值

  4. 因此模为 [1,A]Ag 种取值

  5. 对称地,模为 [HMA,HM1][1,A]x 取值的对应,也有 Ag 个, 再假设 模为 0 恒有一个

  6. g 轮循环,答案为 ans=(Ag2+1)g

  7. 注意特判,当 A==HM2 时,所有分钟都是,即有 HM 个,但按上述算法,由于 A==HMA ,会多算一个

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll H, M, A;
ll gcd(ll a, ll b)
{
	if (b == 0)
		return a;
	return gcd(b, a % b);
}

ll solve()
{
	if (A * 2 == H * M)
		return H * M;
	ll a = H - 1, m = H * M;
	ll g = gcd(m, a);
	ll ans = (A / g * 2 + 1) * g;
	return ans;
}

int main()
{
	cin >> H >> M >> A;
	cout << solve() << endl;
	return 0;
}
posted @   hzy0227  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示