uoj#267. 【清华集训2016】魔法小程序(乱搞)
感觉很像FFT的过程的说……
先来考虑\(b\)如何转化成\(c\),那么只要通过它的逆过程就可以了
首先,我们称“魔法”为比较两个数的字典序,记\(x=a_0\),那么把\(b\)数组每\(x\)个分为一组,在每组里面,\(b_i\%x\)的值都是递增的,也就是说对于同一组里面的每一对\(i<j\),\(i\)的字典序都小于\(j\)的字典序。根据代码,\(c[j]\)最终的值是所有\(i\leq j\)且\(i\)的字典序小于等于\(j\)的所有\(b[i]\)之和。排除掉\(j\)自己,就是所有比它小且字典序比它小的\(b[i]\)之和
如果\(i\)的字典序小于\(j\)的字典序,那么就要\(c[j]+=b[i]\),那么设其中一组为\([l,r]\),我们从左到右枚举\(i\in[l,r-1]\),并令\(b[i+1]+=b[i]\),因为这相当于是一个前缀和的过程,所以对于每一个\(b[i]\),它都加上了所有\(b[j](j<i)\)
字典序第一维不同的情况考虑完了,那么考虑第一维相同而第二维不同,令\(y=a_0\times a_1\),然后每\(y\)个分为一组,那么对于同一组里\(i\)和\(i-x\)是第一维相同而第二维不同的,所以\(b[i]\)要加上\(b[i-x]\)。
那么只考虑第二维会不会漏掉第一维的情况?比方说在第一次分组时,\(j\)位于第\(2\)组,\(i\)为与第\(1\)组,且\(i\)的字典序比\(j\)小,\(i\)就没有加上去。实际上不会有这样的情况,因为我们第一次分组时已经前缀和过了,所以此时\(b[i]\)的值肯定已经加到\(b[j-x]\)中了,所以不会出现漏减的情况
综上,要令\(b\)变为\(c\),记\(sum_i\)为\(a_i\)的前缀积,我们要依次枚举\(sum_i\),分组后在内部从左到右枚举,令每个\(b[j]\)加上\(b[j-sum_{i-1}]\)
于是要令\(c\)变为\(b\),只要将这个过程反过来就可以了,只要倒着枚举前缀积,从右往左枚举\(j\),令每个\(c[j]\)减去\(c[j-sum_{i-1}]\)即可
//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
ll read(){
R ll res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]=' ';
}
const int N=1e6+5,M=1e4+5;
int a[M],b[N],las[N],tmp[N],st[N];ll c[N];
int n,m,top,tt;
void out(){
print(n),sr[C]='\n';
fp(i,0,n-1)print(a[i]);sr[C]='\n';
print(m),sr[C]='\n';
fp(i,0,m-1)print(c[i]);sr[C]='\n';
}
int main(){
// freopen("testdata.in","r",stdin);
n=read();
fp(i,0,n-1)a[i]=read();
m=read();
fp(i,0,m-1)c[i]=read();
st[++top]=1;
for(R int i=0;i<n&&1ll*st[top]*a[i]<=m;++i)
if(a[i]!=1)++top,st[top]=st[top-1]*a[i];
st[++top]=m+1;
for(R int mid=st[top];top>1;mid=st[--top]){
for(R int i=0;i<m;i+=mid){
int j=min(i+st[top]-1,m-1);
while(j>=i+st[top-1])c[j]-=c[j-st[top-1]],--j;
}
}
out();
return Ot(),0;
}
uoj#267. 【清华集训2016】魔法小程序(乱搞)的更多相关文章
- [UOJ#274][清华集训2016]温暖会指引我们前行
[UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...
- [UOJ#276][清华集训2016]汽水[分数规划+点分治]
题意 给定一棵 \(n\) 个点的树,给定 \(k\) ,求 \(|\frac{\sum w(路径长度)}{t(路径边数)}-k|\)的最小值. \(n\leq 5\times 10^5,k\leq ...
- BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...
- [UOJ#276]【清华集训2016】汽水
[UOJ#276][清华集训2016]汽水 试题描述 牛牛来到了一个盛产汽水的国度旅行. 这个国度的地图上有 \(n\) 个城市,这些城市之间用 \(n−1\) 条道路连接,任意两个城市之间,都存在一 ...
- UOJ 275. 【清华集训2016】组合数问题
UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...
- UOJ #269. 【清华集训2016】如何优雅地求和
UOJ #269. [清华集训2016]如何优雅地求和 题目链接 给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\). 然后求: \[ Q(f,n,x ...
- 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)
[UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
- UOJ_274_[清华集训2016]温暖会指引我们前行_LCT
UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...
- 【UOJ274】【清华集训2016】温暖会指引我们前行 LCT
[UOJ274][清华集训2016]温暖会指引我们前行 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很 ...
随机推荐
- EasyPlayer Android安卓流媒体播放器实现播放同步录像功能实现(附源码)
本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551,John是EasyPusher安卓直播推流.EasyPlayer直播流媒体播放端的开发和维护者 ...
- DuiLib笔记之Window常用属性
caption 可拖拽以移动窗口的标题区,类型:RECT.例如,要指定标题区高度为35,可设置caption="0,0,0,35" mininfo 窗口最小尺寸,类型:SIZE.例 ...
- DNS常见攻击与防范
DNS常见攻击与防范 转自:http://www.williamlong.info/archives/3813.html 日期:2015-7-10 随着网络的逐步普及,网络安全已成为INTERNET路 ...
- Oracle查询正在执行的SQL语句
查看 Oracle 正在执行的 sql 语句以及发起的用户 SELECT b.sid oracleID, b.username 用户名, b.serial#, paddr, sql_text 正在执行 ...
- "makefile:5: *** missing separator. Stop."【转】
本文转载自:http://blog.csdn.net/fireroll/article/details/8607903 写makefile时出现这个错误提示 是表示makefile中的命令前没有使用T ...
- 'gbk' codec can't encode character '\xa5' in position 4546: illegal multibyte sequence错误解决
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030') 原文 http://blog.csdn.net/jim7424 ...
- 追求代码质量: 用 AOP 进行防御性编程
原文出处: IBM中国 开发人员测试的主要缺点是:绝大部分测试都是在理想的场景中进行的.在这些情况下并不会出现缺陷 —— 能导致出现问题的往往是那些边界情况. 什么是边界情况呢?比方说,把 null ...
- jinja 多值合并
示例 {% for node in groups["db"] %} {{ node | join("") }}:5672 {% if not loop.last ...
- PYTHON 爬虫笔记三:Requests库的基本使用
知识点一:Requests的详解及其基本使用方法 什么是requests库 Requests库是用Python编写的,基于urllib,采用Apache2 Licensed开源协议的HTTP库,相比u ...
- 10个常见的 Android 新手误区
在过去十年的移动开发平台中,作为资深的移动开发人员,我们认为Android平台是一个新手最广为人知的平台.它不仅是一个廉价的工具,而且有着良好的开发社区,以及从所周知的编程语言(Java),使得开发A ...