• NYOJ 45 棋盘覆盖 模拟+高精度


    题意就不说了,中文题。。。

    小白上讲了棋盘覆盖,于是我就挖了这题来做。


    棋盘覆盖的推导不是很难理解,就是分治的思想,具体可以去谷歌下。

    公式就是f(k) = f(k - 1) * 4 + 1,再化解下就是4^0 + 4^1 + 4^2 + ... + 4^(n-1)。


    思路很简单,但是题目没想象中的简单,刚开始天真的用递归模拟了下就交上去,立马wa掉。。。

    发现即使用Long long类型,n到32就挂了 +_+。。。

    于是实在不是很懂,难道一定要用高精度吗?贵了好久,最后只得找到一篇题解来理解,顺便学了一下万进制,很神奇的高精度~

    虽然跪了,但收获还是蛮大的。看讨论里面说数据只有100,表示不想作弊。。。

    代码:

     /*
     *   Author:        illuz <iilluzen[at]gmail.com>
     *   Blog:          http://blog.csdn.net/hcbbt
     *   File:          45.cpp
     *   Lauguage:      C/C++
     *   Create Date:   2013-08-31 19:39:38
     *   Descripton:    nyoj 45, cheesboard coverage, wan jin zhi 
     */
    #include <cstdio>
    
    const int MAXN = 100;
    int a[MAXN];			// 万进制,每位存4进制
    
    int main() {
    	int n, m, c;
    	scanf("%d", &n);
    	while (n--) {
    		scanf("%d", &m);
    		if (m == 1) {
    			printf("1
    ");
    			continue;
    		}
    		a[0] = 1;
    		int t = 0;			// 已经用到第几位
    		for (int i = 1; i < m; i++) {
    			c = 0;		// c为进位数
    			for (int j = 0; j <= t; j++) {
    				a[j] = a[j] * 4 + c;
    				c = a[j] / 10000;
    				a[j] %= 10000;
    			}
    			if (c != 0) {
    				t++;
    				a[t] = c;
    			}
    			a[0]++;
    		}
    		// 处理最后的进位,其实就是99999999这种情况,这里可以不用
    //		for (int j = 0; j <= t; j++) {
    //			c = a[j] / 10000;
    //			a[j] %= 10000;
    //		}
    //		if (c != 0) {
    //			t++;
    //			a[t] = c;
    //		}
    		printf("%d", a[t]);
    		for (int i = t - 1; i >= 0; i--)
    			printf("%04d", a[i]);
    		printf("
    ");
    	}
    	return 0;
    }
    


  • 相关阅读:
    python ConfigParser、shutil、subprocess、ElementTree模块简解
    python中getattr函数 hasattr函数
    对简历的一点看法
    信息过载下的时间管理
    沉默的QQ
    想把余生变诗篇
    你的薪水偏高了吗?
    写给三十五岁的自己
    传统企业对互联网的痴心妄想
    小二,换大碗!
  • 原文地址:https://www.cnblogs.com/riskyer/p/3293855.html
Copyright © 2020-2023  润新知