康纳的表情包(思维)
UMR 现在手里有 n 张康纳的表情,最上面一张是玛吉呀巴库乃。现在 UMR 如果每次把最上面的 m 张牌移到最下面而不改变他们的顺序及朝向,那么至少经过多少次移动玛吉呀巴库乃才会又出现在最上面呢?
Input
多组输入。
对于每组数据,输入以空格分隔的两个整数 n 和 m (1 <= n, m <= 10^9)。
Output
对于每组数据,输出一个整数,表示至少移动的次数。
Sample Input
54 12
Sample Output
9
解题思路:当时这道题在组队赛中是我看的,碰巧之前有一个同学问过我一个约瑟夫环的问题我就把这道题当做了类似约瑟夫环的问题,用队列写了一发,时间超限,看了看数据量10^9,觉得这可能是一道找规律的题目,于是想了想,找到了这样一个规律。想让这一张纸牌再次出现在最上面我们需要移动的总的牌数一定是纸牌数的倍数,也一定是每次移动牌数的倍数,于是求两者的最小公倍数就一定是最少的移动总牌数,再用移动的总牌数除以每次移动的牌数,就可以得到最少的移动次数。
这里需要用到一个公式:lcm(n,m)*gcd(n,m)=n*m
所以 lcm(n,m) = (n*m)/gcd(n,m)
counts = lcm(n,m)/m
最后整理得到
counts = n/gcd(n,m)
1 #include<algorithm> 2 #include<cstdio> 3 using namespace std; 4 int main() 5 { 6 int n,m; 7 while(~scanf("%d%d",&n,&m)) 8 printf("%d\n", m/__gcd(n,m)); 9 return 0; 10 }