zoukankan      html  css  js  c++  java
  • UVA 11774

    UVA 11774 - Doom's Day

    题目链接

    题意:给定一个3^n*3^m的矩阵,要求每次按行优先取出,按列优先放回,问几次能回复原状

    思路:没想到怎么推理,找规律答案是(n + m) / gcd(n, m),在topcoder上看到一个证明,例如以下:

    We can associate at each cell a base 3-number, the log3(R) most significant digits is the index of the row of the cell and the log3(C) least significant digits is the index of his column.

    What are the transformation now ?
    position in row-major order is rC+c
    position in column-major order is c
    R+r

    We should shift down by log3(C) the most significant digits and shift up the least significant digits by log3(R).
    C=3^6, R=3^4

    now : rrrrcccccc (rrrr)(cccccc)
    then: ccccccrrrr (cccc)(ccrrrr)

    the first 4 digit are always the number of row (0-indexed) and the last 6 digit the number of column of the cell (0-indexed)
    Now this process is valid for each possible r or c, so we can choose r=1 and c=0 and find a the length of this recurring cycle.
    Calling L the length of this basic cycle, all other cycle are combination of this one so the only possible length are divisor of L, so the solution of our problem is (m+n)/L
    rrrr=0001
    cccccc=000000
    day 0 : 0001000000 (0001)(000000)
    day 1 : 0000000001 (0000)(000001)
    day 2 : 0000010000 (0000)(010000)
    day 3 : 0100000000 (0100)(000000)
    day 4 : 0000000100 (0000)(000100)
    day 5 : 0001000000 (0001)(000000)
    For solving this problem we can find the the minimal x such that x*n mod (n+m)=0, this imply x=gcd(n, n+m)=gcd(n, m).
    The solution of our original problem is (n+m)/x or (n+m)/gcd(n,m).

    然后看了之后还是不理解啊,有哪个大神理解这个推理过程求指导一下。。

    代码:

    #include <stdio.h>
    #include <string.h>
    
    int t;
    long long n, m;
    
    long long gcd(long long a, long long b) {
    	if (!b) return a;
    	return gcd(b, a % b);
    }
    
    int main() {
    	int cas = 0;
    	scanf("%d", &t);
    	while (t--) {
    		scanf("%lld%lld", &n, &m);
    		printf("Case %d: %lld
    ", ++cas, (n + m) / gcd(n, m));
    	}
    	return 0;
    }


  • 相关阅读:
    可重入的自旋锁
    自旋锁浅析
    hibernate规避SQL注入实例
    关于2B的转义问题
    java指定文件编码格式
    win10下启动zkui
    【转】角落的开发工具集之Vs(Visual Studio)2017插件推荐
    《LINQ技术详解C#》-4.延迟操作符(第2部分 LINQ到对象)
    《LINQ技术详解C#》-2.查询表达式翻译为标准查询操作符
    Code alignment 代码对齐改进(VS2017)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4009198.html
Copyright © 2011-2022 走看看