传送门

题目大意

$1,2...n,n$个数从小到大排列,有$m$此操作,每次操作给定一个参数$x$,将当且数列作为循环节无限地展开下去,再取前$x$个作为新的数列,求最终的数列每个数出现的次数。

$n,m\leq 10^5,x\leq 10^{18}$

题解

人类智慧题

首先对于两个$x$不递增的连续操作,上一次操作是没有意义的,对于第一次操作$x<n$,要特判出来。

记当前数列长度为$len$,新家入的操作是$x$,先算出$x$中有多少个$len$,就知道最终答案会由多少个$len$代表的数列构成。由于每一步操作留下的数列一定会作为循环节的前缀出现在新数列中,我们将$x\mod len$的值计算出来,再递归找到最后一个操作使得该操作结束后$len<x$,递归处理即可,直到$x\leq n$,这样就将$1-x$的数依次加入最终答案即可。

考虑从最后一个操作向前递推,不断求出形如$1-x$独立出现了多少次,最终统计答案即可。

由于对于每一步操作,每一次查找$len$出现的位置需要二分,每次$x$由于取模的缘故会至少变为原来的一半,所以是查找不会超过$\log x$次,复杂度为$O(m\log m\log x+n)$。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 100020
using namespace std;
const int BS=1<<19;char BF[BS],OT[BS],*SZ=OT,*HD,*TL;
const char *ED=OT+BS-1; char SS[20]; int Top;
char Getchar(){if(HD==TL) TL=(HD=BF)+fread(BF,1,BS,stdin);return *HD++;}
void flush(){fwrite(OT,1,SZ-OT,stdout);}
void Putchar(char c){*SZ++ =c;if(SZ==ED) flush(),SZ=OT;}
void write(LL x){
if(!x){Putchar(x),Putchar('\n');}
while(x) SS[++Top]=(x%10+'0'),x/=10;
while(Top) Putchar(SS[Top]),Top--; Putchar('\n');
}
LL read(){
LL nm=0,fh=1; char cw=Getchar();
for(;!isdigit(cw);cw=Getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=Getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
LL n,T,m,p[M],N,G[M],F[M],K[M],tmp;
int main(){
n=read(),T=read();
while(T--){LL x=read(); while(m&&p[m]>=x) m--; p[++m]=x;}
if(m&&p[1]<n){N=n,n=p[1];for(LL i=1;i<m;i++) p[i]=p[i+1];m--;}
G[0]=p[0]=n,F[m]=1;
for(LL i=m;i>=0;i--){
LL res=p[i],now=i-1;
while(res>n){
LL k=res/p[now]; F[now]+=F[i]*k,res-=k*p[now];
now=upper_bound(p,p+now,res)-p-1;
} G[i]=res,K[1]+=F[i],K[G[i]+1]-=F[i];
}
for(LL i=1;i<=n;i++) K[i]+=K[i-1],write(K[i]);
while(n<N) n++,Putchar('0'),Putchar('\n'); flush(); return 0;
}

最新文章

  1. R语言 常见模型
  2. codeforces 442B B. Andrey and Problem(贪心)
  3. iframe获取父、子窗口的方法
  4. 你真的会使用SQL Server的备份还原功能吗?之一:恢复模型
  5. json分别算出元素的个数和最多的元素
  6. php析构函数
  7. Linux下如何查看哪些端口处于监听状态
  8. html---textarea初始化时就有个table空格以及tab键操作无效
  9. [maven] 新建项目一直提示loading archetype list
  10. java thread park
  11. 每周刷题记录--by noble_
  12. 嵌入式Linux引导过程之1.3——Xloader的sys_init
  13. 翻译:group_concat()函数(已提交到MariaDB官方手册)
  14. Hiero中的Events机制
  15. Linux内核分析 读书笔记 (第一章、第二章)
  16. oracle性能诊断艺术-执行计划
  17. 给iOS开发新手送点福利,简述UIPageControl的属性和用法
  18. Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介
  19. ubuntu 安装部分设置U盘启动系统安装盘操作
  20. bzoj 1853 容斥 + 搜索

热门文章

  1. ios开发:如何用js调用ios
  2. java开发知识体系
  3. 启动/关闭Spring boot服务脚本
  4. Django 之 缓存机制
  5. Linux安装python3.7.2详细操作步骤
  6. 用VirtualBox和vagrant在win7&amp;#215;64上搭建ruby on rails 开发环境
  7. PHP网站在Linux服务器上面的安全配置
  8. java基础入门之数组排序冒泡法
  9. 在网页中显示PDF文件及vue项目中弹出PDF
  10. Python赋值原理:Python无变量,万物皆对象