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住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很 ...
随机推荐
- c# 怎么获取自己的IP地址
1.aspx页面,asp.net项目的页面 <%@ Page Language="C#" AutoEventWireup="true" CodeBehin ...
- JQery 动态填充数据到table 中
说明: 1.把数据库中的数据查询出来,填充到前台的table中,注意 从数据查询出来的 属性IsNew="0"(table 行tr的属性) 2.单击“添加”按钮 新添加行追加到ta ...
- 九度OJ 1128:求平均年龄 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2080 解决:1084 题目描述: 班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位. 输入: 第 ...
- 如何分析一个已有的Delphi项目源代码
分析一个已有的Delphi项目,应该从以下入手(按先后顺序):1. 编译条件,包括自定义的Condition以及inc文件里的标识2. 主项目文件dpr,因为窗体的windows消息循环只是程序的一部 ...
- 7.JavaScript变量
VAR声明变量,一条语句可以声明多个变量 var name="Gates", age=56, job="CEO"; Value = undefined 在计算机 ...
- view定位
- 一篇文章搞明白CORS跨域
面试问到数据交互的时候,经常会问跨域如何处理.大部分人都会回答JSONP,然后面试官紧接着就会问:"JSONP缺点是什么啊?"这个时候坑就来了,如果面试者说它支持GET方式,然后面 ...
- GIN+GORILLA=A GOLANG WEBSOCKET SERVER
鉴于聊天已然成为大部分app的基础功能,而大部分app用户基数有没有辣么大,常用的聊天server架构如xmpp或者消息队列实现之类的用起来还挺麻烦的,有比较难跟网页端做交互,加之H5标准落地,所以w ...
- sendevent是使用
按下: sendevent /dev/input/event4 1 254 1 sendevent /dev/input/event4 0 0 0 松开: sendevent /dev/input/e ...
- animation steps属性实现帧动画
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta na ...