UOJ#267 BZOJ4731【清华集训2016】魔法小程序
2017-03-04 17:47
423 查看
UOJ终于把清华集训的题加上辣!BZOJ上数据还是错的,之前写完代码都没地方交
题意就是让你做任意进制的FWT的逆变换
类比二进制容易得到在k进制下的做法:把整个序列分成k段,分别递归处理剩余位的影响后考虑这一位的影响即可
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<queue>
#include<stack>
using namespace std;
#define MAXN 1000010
#define MAXM 1000010
#define INF 1000000000
#define MOD 1000000007
#define eps 1e-8
#define ll long long
int n,m;
int M=1;
int a[MAXN];
ll c[MAXN];
ll len[MAXN];
int tot;
int L[MAXN],R[MAXN];
int ta[MAXN];
void cal(int l,int r,int d){
int i,j;
if(!d){
return ;
}
int t=0;
int lst=l;
for(i=l;i<=r;i++){
t++;
if(t==len[d-1]||i==r){
cal(lst,i,d-1);
lst=i+1;
t=0;
}
}
t=0;
lst=l;
tot=0;
for(i=l;i<=r;i++){
t++;
if(t==len[d-1]||i==r){
tot++;
L[tot]=lst;
R[tot]=i;
lst=i+1;
t=0;
}
}
for(i=tot;i>1;i--){
for(j=L[i];j<=R[i];j++){
c[j]-=c[j-len[d-1]];
}
}
}
int main(int argc,char *argv[]){
int i;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int tn=0;
for(i=1;i<=n;i++){
if(a[i]!=1){
ta[++tn]=a[i];
}
}
scanf("%d",&m);
ta[tn+1]=m;
for(i=1;i<=m;i++){
scanf("%lld",&c[i]);
}
len[0]=1;
for(i=1;i<=tn+1;i++){
len[i]=len[i-1]*ta[i];
if(len[i]>=m){
cal(1,m,i);
break;
}
}
printf("%d\n",n);
for(i=1;i<=n;i++){
printf(i==n?"%d\n":"%d ",a[i]);
}
printf("%d\n",m);
for(i=1;i<=m;i++){
printf(i==m?"%lld\n":"%lld ",c[i]);
}
return 0;
}
/*
*/
题意就是让你做任意进制的FWT的逆变换
类比二进制容易得到在k进制下的做法:把整个序列分成k段,分别递归处理剩余位的影响后考虑这一位的影响即可
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<queue>
#include<stack>
using namespace std;
#define MAXN 1000010
#define MAXM 1000010
#define INF 1000000000
#define MOD 1000000007
#define eps 1e-8
#define ll long long
int n,m;
int M=1;
int a[MAXN];
ll c[MAXN];
ll len[MAXN];
int tot;
int L[MAXN],R[MAXN];
int ta[MAXN];
void cal(int l,int r,int d){
int i,j;
if(!d){
return ;
}
int t=0;
int lst=l;
for(i=l;i<=r;i++){
t++;
if(t==len[d-1]||i==r){
cal(lst,i,d-1);
lst=i+1;
t=0;
}
}
t=0;
lst=l;
tot=0;
for(i=l;i<=r;i++){
t++;
if(t==len[d-1]||i==r){
tot++;
L[tot]=lst;
R[tot]=i;
lst=i+1;
t=0;
}
}
for(i=tot;i>1;i--){
for(j=L[i];j<=R[i];j++){
c[j]-=c[j-len[d-1]];
}
}
}
int main(int argc,char *argv[]){
int i;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int tn=0;
for(i=1;i<=n;i++){
if(a[i]!=1){
ta[++tn]=a[i];
}
}
scanf("%d",&m);
ta[tn+1]=m;
for(i=1;i<=m;i++){
scanf("%lld",&c[i]);
}
len[0]=1;
for(i=1;i<=tn+1;i++){
len[i]=len[i-1]*ta[i];
if(len[i]>=m){
cal(1,m,i);
break;
}
}
printf("%d\n",n);
for(i=1;i<=n;i++){
printf(i==n?"%d\n":"%d ",a[i]);
}
printf("%d\n",m);
for(i=1;i<=m;i++){
printf(i==m?"%lld\n":"%lld ",c[i]);
}
return 0;
}
/*
*/
相关文章推荐
- UOJ 267 [清华集训2016]魔法小程序
- 【清华集训2016】魔法小程序
- UOJ#274 BZOJ4736 【清华集训2016】温暖会指引我们前行
- BZOJ4735 你的生命已如风中残烛 UOJ#273 【清华集训2016】
- 【BZOJ 4734】【UOJ 269】【清华集训2016】 如何优雅地求和
- UOJ #266 【清华集训2016】 Alice和Bob又在玩游戏
- BZOJ 4736/UOJ #274. 【清华集训2016】温暖会指引我们前行 LCT边权操作
- 清华集训魔法小程序
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
- BZOJ4730 UOJ#266【清华集训2016】Alice和Bob又在玩游戏
- UOJ#273. 【清华集训2016】你的生命已如风中残烛
- [BZOJ4573][UOJ#195][Zjoi2016][LCT][离线]大森林
- 2016清华集训滚粗记
- 【UOJ274】【清华集训2016】温暖会指引我们前行 LCT
- uoj#274. 【清华集训2016】温暖会指引我们前行
- 【XSY1284】【BZOJ3813】【清华集训2014】奇数国 线段树 数学
- [历史最值问题] UOJ #164 【清华集训2015】V
- [BZOJ3813][清华集训2014]奇数国(数论+bit)
- 【清华集训2014】【BZOJ3812】主旋律
- UOJ 274 【清华集训2016】温暖会指引我们前行 ——Link-Cut Tree