UVa 12627 (递归 计数 找规律) Erratic Expansion

直接说几个比较明显的规律吧。

k个小时以后,红气球的个数为3k

单独观察一行:

令f(r, k)为k个小时后r行红气球的个数。

  • 如果r为奇数,f(r, k) = f((r+1)/2, k-1) * 2
  • 如果r为偶数,f(r, k) = f(r/2, k-1)

令g(r, k)为k个小时后r行红气球的个数。

  • 如果r为偶数,g(r, k) = g(r/2, k-1) * 3;
  • 如果r为奇数,g(r, k) = g(r-1, k) + f(r, k);

因此f和g都可以用递归求解。

 1 #include <cstdio>
 2 typedef long long LL;
 3
 4 LL f(LL r, LL k)
 5 {
 6     if(k == 0) return 1LL;
 7     if(r & 1LL) return f((r+1)/2 ,k-1) * 2;
 8     else return f(r/2, k-1);
 9 }
10
11 LL g(LL r, LL k)
12 {
13     if(r == 0) return 0;
14     if(k == 0) return 1LL;
15     LL ans = g(r/2, k-1) * 3;
16     if(r & 1) ans += f(r, k);
17     return ans;
18 }
19
20 int main()
21 {
22     int T; scanf("%d", &T);
23     for(int kase = 1; kase <= T; kase++)
24     {
25         LL k, a, b;
26         scanf("%lld%lld%lld", &k, &a, &b);
27         printf("Case %d: %lld\n", kase, g(b, k) - g(a-1, k));
28     }
29
30     return 0;
31 }

代码君

时间: 2024-10-12 21:03:50

UVa 12627 (递归 计数 找规律) Erratic Expansion的相关文章

[Swust OJ 666]--初来乍到(题号都这么溜~~,递归,找规律)

题目链接:http://acm.swust.edu.cn/problem/0666/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 小李去埃及旅游,但是初来乍到的他不认识罗马数,所以请你将阿拉伯数n ( 0 < n <= 1000)改写为罗马数. Input N行数据,每行一个满足0 < n <= 1000的数: 结束以EOF判断 Output 每行一个,见输出示例 Sample Input 1 10 35 99

bzoj1002 生成树计数 找规律

这道题第一眼是生成树计数,n是100,是可以用O(n^3)的求基尔霍夫矩阵的n-1阶的子矩阵的行列式求解的,但是题目中并没有说取模之类的话,就不好办了. 用高精度?有分数出现. 用辗转相除的思想,让它不出现分数.但过程中会出现负数,高精度处理负数太麻烦. 用Python打表?好吧,Python还不熟,写不出来..... 所以,如果这道题我考场上遇到,最多用double骗到n<=20的情况的部分分. 最终只能求助于题解了... 好像是通过观察行列式的特点,推导出关于答案f(n)的递推式(f(n)=

UVa 1620 Lazy Susan (找规律)

题意:给 n 个数,每次可以把4个连续的数字翻转,问你能不能形成1-n的环状排列. 析:找一下奇偶性,写几个数试试,就会找到规律. 代码如下: #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <set> #include <qu

hdu 1005 递归超限 找规律

因为n>1000000000所以用递归 数组超限, 由递归函数f(n)=(A*f(n-1)+B*f(n-2))%7; 因为是除7的余数 因次一共有7*7=49种情况, 以后的值都和之前的对应相等 所以找到和3,4 重复的数之后,就很容易得到f(n)

(白书训练计划)UVa 12627 Erratic Expansion(递归+找规律)

题目地址:UVa 12627 这题是先找规律,规律在于对于第k个小时的来说,总是可以分成右下角全是蓝色气球,右上角,左下角与左上角三个一模一样的k-1个小时的气球.这样的话,规律就很清晰了,然后用递归做比较方便... 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <ma

uva 12627 - Erratic Expansion(递归求解)

递归的边界条件写的多了--没必要写呢么多的.. 不明白可共同探讨~ #include<cstdio> #include<iostream> #include<cmath> using namespace std; long long dp(int kk,int pos) { int n=kk;int temp=(int)pow(2,n); // printf("%d %d\n",kk,pos); if(kk==0&&pos==1) r

UVA 12627 Erratic Expansion

#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000100; const int INF=1<<29; ll k,a,b; ll s[maxn]; ll f(ll i,ll k) { if(i==0) r

求N!末尾的0的个数--找规律+递归

0\'s Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 计算整数n!(n的阶乘)末尾有多少个0. 输入 第一行输入一个数T代表测试数据个数(T<=20).接下来T行每行1个数代表n(0<=n< 2^31). 输出 对于每个测试数据输n!末尾有多少个0,每行输出一个结果. 示例输入 3 1 5 10 示例输出 0 1 2 提示 中国海洋大学第三届"朗讯杯"编程比赛高级组试题 声明(摘抄至某前辈)--

UVA 1363 Joseph&#39;s Problem 找规律+推导 给定n,k;求k%[1,n]的和。

/** 题目:Joseph's Problem 链接:https://vjudge.net/problem/UVA-1363 题意:给定n,k;求k%[1,n]的和. 思路: 没想出来,看了lrj的想法才明白. 我一开始往素数筛那种类似做法想. 想k%[1,n]的结果会有很多重复的,来想办法优化. 但没走通. 果然要往深处想. 通过观察数据发现有等差数列.直接观察很难确定具体规律:此处应该想到用式子往这个方向推导试一试. lrj想法: 设:p = k/i; 则:k%i = k-i*p; 容易想到