数羊

2023-10-29

H题数羊

第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛

题目描述

憨憨小杨晚上睡不着觉,就开始数羊,她觉得一只一只数太慢了,突发奇想出了一种新的数羊方式,羊羊数量A(n,m)由两个整形变量n和m决定,计算方式如下:
img
现在给出n和m的值,请你帮小杨数数一共有多少只羊。

输入描述:

多组输入。第一行包含一个整数T(1≤T≤1000),表示有T组测试数据。每组测试数据包含一行,包含两个整数n(1≤n≤10^9)和m(0≤m≤2).

输出描述:

对每一组输入,在一行中输出A(n,m)的值,由于输出的结果可能会很大,答案对998244353取模

示例1

输入

3
3 0
3 1
3 2

输出

5
6
8

当初看到这题的时候,这不就是一个分段函数吗,只是用到了递归,可当我写完之后并提交,发现爆内存了。

原来,像这种 阿克曼函数 ,最后一个函数递归太多次,把栈递归穿了,那该怎么办呢?

有没有发现,题目的数据范围中,0≤m≤2,所以m只能是0,1,2。所以我们可以分类讨论。

1.当m==0的时候,上面已经有对应的表达式了。

2.当m == 1的时候,则A(n,1)=A(A(n-1,1),0),这时就可以套用第三个函数,也就是说,A(n,1)=A(n-1,1)+2。左边的n一直减小,直到n==0,就到了第二个式子,等于1,这里面加了n-1个2和最后一个1,所以,A(n,1)=2*(n-1)+1吗?其实不是的。

我们观察最后一个函数,发现里面有个n-1,也就是说当n == 1的时候A(1,m)=A(A(0,m),m-1),由第二个式子A(0,m)=1得,A(1,m)=A(1,m-1),m一直减小,直到m==0,此时符合第一个式子,等于2,因此我们得出一个结论:
A ( 1 , m ) = 2 A(1,m)=2 A(1,m)=2

回到刚才,当n减小到1的时候就停在了2,所以实际上有n个2相加,所以
A ( n , 1 ) = 2 ∗ n A(n,1)=2*n A(n,1)=2n

3.当m==2的时候,也用同样的分析方法,A(n,2)=A(A(n-1,2),1),此时套用上面的结论A(n,1)=2*n,得出A(n,2)=A(A(n-1,2),1)=2A(n-1,2),当n减小到1时符合第一个式子,有n个2相乘,因此
A ( n , 2 ) = p o w ( 2 , n ) A(n,2)=pow(2,n) A(n,2)=pow(2,n)

这样就根据m的取值,进行了分类讨论,将看似是阿克曼函数的问题转化成了单纯用if语句就能做的问题

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#define endl '\n'
#define int long long
#define Please return
#define AC 0
using namespace std;
const int N=1e5+7;
void fastio(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);}
int qpow(int a,int b,int m){int ans=1;while(b){if(b&1)ans=ans*a%m;b>>=1;a=a*a%m;}return ans;}

int func(int a,int b)
{
  if(b==0)return (a+2)%998244353;
  else if(b==1)return (2*a)%998244353;
  elsereturn qpow(2,a,998244353);//快速幂
}

signed main()
{
  fastio();
  int t;
  cin>>t;
  while(t--)
  {int a,b;
​    cin>>a>>b;
​    cout<<func(a,b)<<endl;
  }
  Please AC;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数羊 的相关文章

随机推荐

  • Laravel5.5如何更改使用Bootstrap4的分页

    默认的Laravel5 5使用的还是Bootstrap3的分页结构 与Bootstrap4的html内容是不一致的 介绍一种简单的替换方法 首先 找到你的 resources views vendor pagination 目录 这是lar
  • 关于谷歌浏览器的CSS调式中的Hover样式

    今天的调式代码的时候 想找到网站的Hover样式 可是找了很长时都都没有找到 之后在百度一下 才明白当打开网页的时候 默认是非hover样式 如果需要看hover样式 需要进行勾选一下 勾选之后 才是hover样式 此后才可以在里面看到cs
  • 一遍文章搞懂Vue.js中的各种页面跳转方式和参数传递

    文章目录 一 介绍 1 1 Vue js 是什么 它的路由系统是如何工作的 二 路由基础 2 1 Vue js 路由的概念和基本配置 2 2 路由表的使用方法 三 页面跳转 3 1 使用 router push 进行页面跳转 3 2 使用
  • VS在打开不同SDK时常会出现无法加载该项目的提示

    转载请标明是引用于 http blog csdn net chenyujing1234 有时我们要用VS打开别人的例子程序 可却时常会出现无法加载该项目的提示 这是因为原项目的SDK在现在编译器上没有安装 那么该怎么办呢 也不是束手无策 下
  • internet时间功能被隐藏了,如何使用cmd命令设置时间源并同步

    环境 Win server 2016 问题描述 internet时间功能被隐藏了 如何使用cmd命令设置时间源并同步 win10 时间设置菜单有internet时间 Win server 2016 时间设置菜单没有internet时间 解决
  • 综合练习: 九九乘法表和排序

    输出函数 println相比较print将在每个输出完毕后 输出换行 System out println hello world 输入函数 Scanner numInput new Scanner System in int num Sy
  • python——operator详解

    1 概述 operator模块是python中内置的操作符函数接口 它定义了一些算术和比较内置操作的函数 operator模块是用c实现的 所以执行速度比python代码快 2 函数的映射操作 操作 语法 函数 加法 a b add a b
  • 一种HBase的表region切分和rowkey设计方案

    一种HBase的表region切分和rowkey设计方案 2014 05 14 14 21 56 转载 分类 MYSQL ORACLE DB2 sybase info 一种HBase的表region切分和rowkey设计方案 场景 HBas
  • 如何往服务器拷贝文件,怎样往云服务器拷贝文件

    怎样往云服务器拷贝文件 内容精选 换一换 登录Windows操作系统的弹性云服务器时 需使用密码方式登录 因此 用户需先根据创建弹性云服务器时使用的密钥文件 获取该弹性云服务器初始安装时系统生成的管理员密码 Administrator帐户或
  • selenium 后台运行设置handless模式

    selenium 后台运行设置handless模式 测试脚本调试完毕之后 部署到服务器运行 此时 需要将selenium的执行方式 切换为后台运行 也就是无界面运行 chrome option webdriver ChromeOptions
  • iOS制作启动图LaunchScreen.storyboard

    先制作一张启动图 png格式 启动图制作脚本 https github com QiShare QiAppIconGenerator 注意一个坑点 注意一个坑点 注意一个坑点 如果是横屏的图 那么图片的像素严格按照 宽2208 高1242
  • SpingBoot加解密项目spring-boot-starter-encrypt操作

    Spring Boot封装了一个Starter 内置了AES加密算法 GitHub地址如下 spring boot starter encrypt 先来看看怎么使用 可以下载源码 然后引入即可 然后在启动类上增加 EnableEncrypt
  • 微服务整合knife4j springboot2.6.14

    业务层 springboot集成knife4j 引入jar包依赖
  • Qt.ui文件是怎么生成相应的.h文件

    ui文件在编译文件时通过uic o ui h ui 命令自动生成ui头文件
  • SIMetrix教程-001.SIMetrix软件简介与安装

    由于某些原因需要用到SIMetrix仿真软件 然而网上的资料并不是特别多 故在此记录一下这款仿真软件的学习过程 也给有需要的人提供一些参考 免走弯路 如果使用过Pspice或者LTspice软件 学习SIMetrix会很容易入门 仿真软件都
  • bpe分词算法的原理以及在机器翻译中的应用

    概述 bpe byte pair encoding 是一种根据字节对进行编码的算法 主要目的是为了数据压缩 算法描述为字符串里频率最常见的一对字符被一个没有在这个字符中出现的字符代替的层层迭代过程 该算法在论文 https arxiv or
  • 分布式系统failover测试之拔盘插盘操作

    分布式系统failover测试之拔盘插盘操作 拔盘 echo scsi remove single device 1 0 0 0 gt proc scsi scsi echo scsi remove single device 2 0 0
  • CVPR2023论文及代码合集来啦~

    以下内容由马拉AI整理汇总 下载 点我跳转 狂肝200小时的良心制作 529篇最新CVPR2023论文及其Code 汇总成册 制作成 CVPR 2023论文代码检索目录 包括以下方向 1 2D目标检测 2 视频目标检测 3 3D目标检测 4
  • 图形化OpenGL调试器 BuGLe

    图形化OpenGL调试器 BuGLe 转 BuGLe 结合图形化的OpenGL调试与选择的过滤器上的OpenGL命令流 调试器可以查看状态 纹理 framebuffers 着色器 而过滤器允许日志 错误检查 自由相机控制 视频捕捉等 主页
  • 数羊

    H题数羊 第八届 图灵杯 NEUQ ACM程序设计竞赛个人赛 题目描述 憨憨小杨晚上睡不着觉 就开始数羊 她觉得一只一只数太慢了 突发奇想出了一种新的数羊方式 羊羊数量A n m 由两个整形变量n和m决定 计算方式如下 现在给出n和m的值