当前位置: 首页 > news >正文

UVa12627 Erratic Expansion(递归/找规律)

题目链接
在这里插入图片描述
1.初始有一个红气球,每过一个小时,一个红气球会变成3个红气球和1个蓝气球,一个蓝气球会变成4个蓝气球,如图所示。初始有一个红气球,求经过k个小时以后,第A行到第B行一共有多少个红气球

2.一看就是找规律的题目嘛,本来想到的是记录每行红气球的变化,确实有规律,但是必须由前一个状态求得,而且要用数组记录,但是看了一下k的范围,最大是30的话是1e9,显然数组开不了那么大。看了一下LRJ的分析,是按照前i行的红气球总数来找规律的,类似于前缀和区间[L,R],即f( R )-f(L-1)。那么这样找一下规律后:
在这里插入图片描述
3.设f(k,i)表示k小时后,第i行之前的红气球个数之和。那么我们不难得到:
当i<=2k-1时,f(k,i)=2*f(k-1,i)
当i>2k-1时,f(k,i)=f(k,2k-1)+f(k-1,i-2k-1)
注意到当i为0时直接返回0,当k为0时返回1

4.但是这样写却超时了!因为下面f(k,2k-1)相当于每个数都算了两遍,因此得想办法更快的,注意到f(k,2k-1)=2*f(k-1,2k-1),且都是上个状态的最后一个数,那么不难发现1,3,9,27…,则最后一行可以直接由3k推导得到,最后再乘2即可

#include <iostream>
using namespace std;
typedef long long ll;

ll quick_pow(ll x,ll n){
    ll ans=1;
    while(n){
        if(n&1) ans*=x;
        x*=x;
        n>>=1;
    }
    return ans;
}

ll f(int k,int i){
    if(i==0) return 0;
    if(k==0) return 1;
    ll x=1<<(k-1);
    if(i<=x) return 2*f(k-1,i);
    else return 2*quick_pow(3,k-1)+f(k-1,i-x);
    //else return f(k,x)+f(k-1,i-x);
}

int main()
{
    int t,k,a,b,kase=0;
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>t;
    while(t--){
        cin>>k>>a>>b;
        cout<<"Case "<<++kase<<": "<<f(k,b)-f(k,a-1)<<endl;
    }
    return 0;
}

相关文章:

  • 《金牌网管师》——10年的沉淀,18年的积累
  • 2020 CodeJam Round 1A
  • 如何更换Android模拟器界面
  • 2019 ICPC Latin American Regional Contests 计蒜客重现
  • youtube weburl后缀
  • UVa12174 Shuffle(滑动窗口)
  • Android开发指南-工具-画九宫格
  • UVa1608 Non-boring sequences(尺取+分治)
  • 通过枚举窗口获得窗口句柄名字并重命名窗口
  • “Shopee杯” e起来编程暨WHU2020校赛热身赛
  • CSDN BLOG EXPERT
  • Android开发指南-二维图形
  • n的阶乘在m进制下结尾0的个数
  • Codeforces Round #634 (Div. 3)
  • 《程序员羊皮卷》诚征书评
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • android图片蒙层
  • Angularjs之国际化
  • C++类的相互关联
  • Github访问慢解决办法
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Linux各目录及每个目录的详细介绍
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • node和express搭建代理服务器(源码)
  • select2 取值 遍历 设置默认值
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 后端_MYSQL
  • 解析 Webpack中import、require、按需加载的执行过程
  • 使用parted解决大于2T的磁盘分区
  • 通过npm或yarn自动生成vue组件
  • 异常机制详解
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #、%和$符号在OGNL表达式中经常出现
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #pragma data_seg 共享数据区(转)
  • #宝哥教你#查看jquery绑定的事件函数
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • %check_box% in rails :coditions={:has_many , :through}
  • (04)odoo视图操作
  • (JS基础)String 类型
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)scrum常见工具列表
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Micro Framework 4.2 beta 源码探析
  • .net 程序发生了一个不可捕获的异常
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数