题意:

给你一片纸,你可以对它进行四种操作,分别是向上、向下、向左、向右对折。把对折之后的纸片横向剪开,再纵向剪开(十字架剪开)

问你你能剪出来的纸片的期望个数

题解(参考:https://blog.csdn.net/fztsilly/article/details/107799718):

很显然,向下和向上对折是一样的,向左和向右对折一样。那么也就变成了两种对折方式(这里为向下和向右)。选择其中某种方法可能性为1/2,同时对折的先后顺序不影响最后结果,即“右右下”和“下右右”对折后剪开的纸片数量一样

规律:往上下方向折k次,会有2k条割线,那么横着切一刀展开后的纸片数有2k+1张,这个+1就是最中间折痕左右两边纸片算一个,同理左右折。

假设折n次的情况下,设左右折次数为k,那么上下折次数为n−k。

那么总纸片数量为:(2k+1)*(2n-k+1)

因为折纸片的折叠操作顺序可以改变(“右右下”和“右下右”折出来的纸片数量都一样),所以这个结果应该乘于Ckn ,又因为最后结果是期望,且一种操作执行概率为1/2,那么最后再乘于1/2n

代码:

#include<stack>
#include<queue>
#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
using namespace std;
typedef long long ll;
const int maxn=6e6+1;
const int mod=998244353;
const ll inv2 = 499122177;
ll quick_pow(ll a, ll b)
{
ll ans = 1, base = a;
while(b != 0)
{
if(b&1)
{
ans = ans * base;
ans %= mod;
}
base = base * base % mod;
b >>= 1;
}
return ans;
}
int main()
{
ll t;
cin >> t;
while(t--)
{
ll n;
cin >> n;
if(n == 0)
{
cout << 4 << endl;
continue;
}
ll k = (2 * quick_pow(3 * inv2 % mod, n) % mod + quick_pow(2, n) + 1) % mod;
cout << k << endl;
}
return 0;
}

最新文章

  1. Linux系统virtualbox + ubuntu + xshell 问题与注意事项
  2. C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo
  3. hadoop2.6.2分布式环境搭建
  4. 设计模式(十四):Command命令模式 -- 行为型模式
  5. jQuery 图表
  6. 从源码解析TreeMap
  7. HBase架构
  8. 使用Putty实现windows向阿里云的Linux云服务器上传文件
  9. 阿里云或本地部署服务器(一)---nginx本地和服务器代理
  10. 虚拟机安装CentOS7(一)
  11. Chapter 5 Blood Type——23
  12. C++STL模板库关联容器之set/multiset
  13. java.io.FileNotFoundException:my-release-key.keyStore拒绝访问
  14. nginx 配置文件学习
  15. Android沉浸式状态栏的简单实现
  16. CF 449D 题解(状压+容斥)
  17. P1220 关路灯 (区间dp)
  18. 【HDOJ3861】【Tarjan缩点+最小路径覆盖】
  19. mybatis 插件安装与使用
  20. CentOS 7 Docker基本特性

热门文章

  1. C++中的extern“C”
  2. Docker 镜像管理及基础命令(二)
  3. stat filename
  4. Linux下Too many open files问题排查与解决
  5. oracle 释放表空间到OS(resize)
  6. 【linux】系统编程-7-网络编程
  7. 鸿蒙的fetch请求加载聚合数据的前期准备工作-手动配置网络权限
  8. window安装nvm
  9. Vue的核心思想
  10. 架构风格 vs. 架构模式 vs. 设计模式(译)