F - Delete 1, 4, 7, ...

设\(f(i)\)表示第一次操作后,第\(i\)个位置的数,那么\(f(i)=\lfloor \frac{3i+1}2\rfloor\)

那么\(k\)次操作后,第\(i\)个位置上的数就是:

\[f(f(...f(f(i))...))=f^k(i)
\]

设\(cnt_k\)表示\(k\)次操作后剩下的数的个数,那么显然有:\(cnt_i=\lfloor \frac {cnt_{i-1}\times2}3\rfloor\)

最后的答案就是\(\sum_{i=1}^{cnt_k}f^k(i)\)

若采用最暴力的方法递推出所有的\(f^k(i)\),那么复杂度为\(O(k\times cnt_k)\)

由因为\(cnt_k\leq n\times(\frac 23)^k\),所以复杂度为\(O(nk(\frac 23)^k)\)

当\(k\)很大时,这个复杂度就很优秀,但当\(k\)较小时,这个复杂度就过大了,所以考虑用另一种做法来解决较小的\(k\)

考虑\(f^k(i)\)与\(f^k(j)\)的关系,有:

\[f^k(n+2^k)=f^k(n)+3^k
\]

当\(k=1\)时,由题意得证

当\(k>1\)时:

\[\begin{aligned}
f^k(n+2^k)&=f^{k-1}(f(n+2^k))\\
&=f^{k-1}(\lfloor\frac{3n+3\times 2^k+1}2\rfloor)\\
&=f^{k-1}(3\times 2^{k-1}+\lfloor\frac{3n+1}2\rfloor)\\
&=f^{k-1}(3\times 2^{k-1}+f(n))\\
&=f^k(n)+3^k
\end{aligned}
\]

所以我们只需要求出前\(2^k\)个\(f^k(i)\)就可以得出所有的\(f^k(i)\)

这样复杂度就降到了\(O(k2^k)\),但还是差点,考虑继续优化

将\(f^k(i)\)拆成\(f^x(f^y(i))\),其中\(x+y=k\),那么有:

\[\begin{aligned}
f^k(i+2^yj)&=f^x(f^y(i+2^yj))\\
&=f^x(f^y(i)+3^yj)
\end{aligned}
\]

那么我们的答案就从\(\sum_{i=1}^{cnt_k}f^k(i)\)变成了:枚举\(i\in[1,2^y]\),\(\sum_jf^x(f^y(i)+3^yj)\)

然后又有\(i+2^yj\leq cnt_k\),那么求得\(j\)的上界为\(\lfloor\frac{cnt_k-i}{2^y}\rfloor+1\)

多算没关系,因为是0

设\(g(a,i)\)表示\(\sum_{j=0}^{2^i-1}f^x(a+3^yj)\),那么有转移:

\[g(a,i)=g(a,i-1)+g(a+3^y2^{i-1},i-1)\\
g(a,0)=f^x(a)
\]

还有一个优化,当\(a>2^x\)时,有:

\[g(a,i)=g(((a-1)\%2^x)+1,i)+3^x\frac{a-1}{2^x}2^i
\]

这一部分的复杂度为\(O(2^y\log n+2^xk)\),当\(x=y=\frac k2\)时,复杂度为\(O((k+\log n)2^{\frac k2})\)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=105,MOD=998244353;
ll n,k,cnt[N],ans,X,Y,p3[N],dp[1100000][45];
ll f(ll x,ll k){
for(int i=1;i<=k;++i) x=(x*3+1)/2;
return x;
}
ll g(ll a,ll i){
if(a>(1ll<<X)){
ll t=((a-1)/(1ll<<X))%MOD;
return (g((a-1)%(1ll<<X)+1,i)+t*(p3[X]%MOD)%MOD*((1ll<<i)%MOD)%MOD)%MOD;
}
if(!i) return f(a,X)%MOD;
if(dp[a][i]) return dp[a][i];
return dp[a][i]=(g(a,i-1)+g(a+p3[Y]*(1ll<<i-1),i-1))%MOD;
}
void add(ll &x,ll y){
x+=y;
if(x>=MOD) x-=MOD;
}
void work1(){
X=k/2,Y=k-X,p3[0]=1;
for(int i=1;i<=30;++i) p3[i]=p3[i-1]*3;
for(int i=1;i<=min(cnt[k],1ll<<Y);++i){
ll lim=(cnt[k]-i)/(1ll<<Y)+1,a=f(i,Y);
for(int j=0;j<=50;++j) if(lim&(1ll<<j)) add(ans,g(a,j)),a+=p3[Y]*(1ll<<j);
}
}
void work2(){
for(int i=1;i<=cnt[k];++i) add(ans,f(i,k)%MOD);
}
int main(){
scanf("%lld%lld",&n,&k);
cnt[0]=n;
for(int i=1;i<=k;++i) cnt[i]=cnt[i-1]*2/3;
if(k<=40) work1();
else work2();
printf("%lld",ans);
return 0;
}

[arc135f] Delete 1, 4, 7, ...的更多相关文章

  1. 如何区别数据库删除语句drop与delete与truncate?

    1.delete:删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行) 删除某一行:delete from 数据表名称 where 列名称=值: 删除所有行:delete*fro ...

  2. 数据库设计中的Soft Delete模式

    最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...

  3. 关于JavaScript中的delete操作

    关于JavaScript中的delete操作 看到一道题,是这样的: (function(x){ delete x; return x; })(1); 1 null undefined Error 我 ...

  4. Git异常:Cannot delete the branch 'test1' which you are currently on

    GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...

  5. HTTP Method详细解读(`GET` `HEAD` `POST` `OPTIONS` `PUT` `DELETE` `TRACE` `CONNECT`)

    前言 HTTP Method的历史: HTTP 0.9 这个版本只有GET方法 HTTP 1.0 这个版本有GET HEAD POST这三个方法 HTTP 1.1 这个版本是当前版本,包含GET HE ...

  6. IIS7.5上的REST服务的Put,Delete操作发生HTTP Error 405.0 - Method Not Allowed 解决方法

    WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在I ...

  7. ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法

    原文 Examining the Details and Delete methods 作者 Rick Anderson 翻译 谢炀(Kiler) 校对 许登洋(Seay).姚阿勇(Mr.Yao) 打 ...

  8. new/delete重载

    在c++中,有时我们需要在运行阶段为一个变量分配未命名的内存,并使用指针来访问它,这里就可以用到new关键字.另外需要指出的是,new分配的内存块通常与常规变量分配的内存块不同,常规变量的值都储存在被 ...

  9. EC笔记:第三部分:16成对使用new和delete

    我们都知道,申请的资源,使用完毕后要释放.但是这个释放动作,一定要注意. 举个例子,很多人动态分配的资源,在使用之后,往往直接调用了delete,而不管申请资源的时候用的是new还是new[]. 如下 ...

  10. Spring boot: Request method 'DELETE' not supported, Request method 'PUT' not supported, Request method 'POST' not supported

    GET,POST,PUT,DELETE, Spring都支持,不要怀疑Spring, 一定是前端发送的rest 请求和后端的响应不匹配, 查找原因以及解决办法, 很简单 用chrome打开F12控制台 ...

随机推荐

  1. iis 固定回收问题

    项目背景:站点有一个计算业务场景,耗时较久.    偶发性发生:进度条过程中,发生卡死.日志没有然后记录.    查看windows 事件,问题时间 有was  自动回收 当前站点 ,如下图 后设置 ...

  2. 在Java集合框架中,`Set`接口是一个重要的接口,它表示一个不包含重复元素的集合。常见的`Set`实现类有`HashSet`、`LinkedHashSet`和`TreeSet`。下面是关于`Set`接口的一些基本用法和方法介绍:

    常用实现类 HashSet: 基于哈希表实现,元素无序. 插入.删除.查找操作的时间复杂度为O(1). LinkedHashSet: 继承自HashSet,并使用双向链表来维护元素的插入顺序. 保留元 ...

  3. String常见面试题

    第一题:打印的结果是true还是false呢? 在之前我们就说过这题,执行s1时,检查字符串常量池,发现没有"abc",于是创建"abc",执行s2时,接着检查 ...

  4. 【Ubuntu】在Ubuntu上安装IDEA

    [Ubuntu]在Ubuntu上安装IDEA 零.前言 最近换了Ubuntu系统,但是还得是要写代码,这样就不可避免地用到IDEA,接下来介绍一下如何在Ubuntu上安装IDEA. 壹.下载 这一步应 ...

  5. Codeforces Round 944 (Div. 4)

    知识点模块 1. ai xor aj<=4 意味着两个数字的二进制位,只能有后两位的二进制位不同,因为如果第三位二进制位不同,就会出现异或的结果大于4 2.要有化曲为直的思想 学会把曲线上的坐标 ...

  6. MySQL 中的数据排序是怎么实现的?

    MySQL 中的数据排序实现 在 MySQL 中,数据排序是通过 ORDER BY 子句实现的,主要涉及 文件排序 和 索引排序 两种方式. 1. 排序的基本原理 MySQL 的排序实现分为以下两种情 ...

  7. React AntD的Dropdown组件报错:React.Children.only expected to receive a single React element child.可能的n原因

    React.Children.only expected to receive a single React element child. Error: React.Children.only exp ...

  8. IIS—503错误排查

    服务器返回503(IIS Service Unavailable HTTP Error 503. The service is unavailable.)+IIS常见优化设置策略 - Yuliang. ...

  9. 关于Bevy中的原型Archetypes

    认识Bevy中的原型 Bevy是基于ECS(Entity-Component-System)架构的游戏引擎,其中的Entity实体是游戏中的一个基本对象,但实体本身通常只是一个标识id,它不包含任何具 ...

  10. 【HUST】网安|操作系统实验|实验一 内核编译、系统调用、编写批处理脚本

    文章目录 目的 任务 前言 一.linux内核编译 非常靠谱的两篇参考文章: 补注: 总结 二.添加新的系统调用 特别靠谱的参考文章: 补注: 1. 我修改的文件: 2. 图中需要敲入的全部代码: 3 ...