题意很简单,就是求这个数。。。

其实场上我想出了分治fft的正解。。。然而不会打。。。然后打了个暴力fft挂了。。。

没啥好讲的,这题很恶心,卡常卡精度还爆int,要各种优化,有些dalao写的很复杂我都没看懂。。。我写的是每三位拆分然后再合并

代码:

 //强烈谴责卡常数而需要大量优化
//upd:还卡精度。。。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
const double pi=acos(-);
struct complex{
double a,b;
complex(double _a=,double _b=){
a=_a;
b=_b;
}
friend complex operator +(complex x,complex y){return complex(x.a+y.a,x.b+y.b);}
friend complex operator -(complex x,complex y){return complex(x.a-y.a,x.b-y.b);}
friend complex operator *(complex x,complex y){return complex(x.a*y.a-x.b*y.b,x.a*y.b+x.b*y.a);}
friend complex operator *(complex x,double y){return complex(x.a*y,x.b*y);}
friend complex operator /(complex x,double y){return complex(x.a/y,x.b/y);}
};
int n,tot=,bit,bitnum,rev[],tmp[],A[],B[],bs[],a[];
char out[];
void fft(complex *s,int op){
for(int i=;i<bit;i++)if(i<rev[i])swap(s[i],s[rev[i]]);
for(int i=;i<bit;i<<=){
complex w(cos(pi/i),op*sin(pi/i));
for(int p=i<<,j=;j<bit;j+=p){
complex wk(,);
for(int k=j;k<i+j;k++,wk=wk*w){
complex x=s[k],y=wk*s[k+i];
s[k]=x+y;
s[k+i]=x-y;
}
}
}
if(op==-){
for(int i=;i<=bit;i++){
s[i]=s[i]/(double)bit;
}
}
}
void mul(int a[],int b[],int c[],int n,int m){
static complex s1[],s2[];
for(bitnum=,bit=;bit<=m+n;bit<<=)bitnum++;
for(int i=;i<bit;i++){
rev[i]=(rev[i>>]>>)|((i&)<<(bitnum-));
}
for(int i=;i<n;i++)s1[i].a=a[i],s1[i].b=;
for(int i=;i<m;i++)s2[i].a=b[i],s2[i].b=;
for(int i=n;i<bit;i++)s1[i].a=s1[i].b=;
for(int i=m;i<bit;i++)s2[i].a=s2[i].b=;
fft(s1,);
fft(s2,);
for(int i=;i<bit;i++)s1[i]=s1[i]*s2[i];
fft(s1,-);
ll p=;
for(int i=;i<m+n||p;i++){
p+=(ll)(s1[i].a+0.5);
c[i]=p%;
p/=;
}
}
void add(int a[],int b[],int n){
int p=;
for(int i=;i<n||p;i++){
p+=a[i]+b[i];
a[i]=p%;
p/=;
}
}
void cdq(int l,int r,int A[],int B[]){
if(l==r){
A[]=bs[l]%;
A[]=bs[l]/%;
A[]=bs[l]/;
B[]=a[l]%;
B[]=a[l]/%;
B[]=a[l]/;
return;
}
int mid=(l+r)/,ll=(mid-l+)*,rr=(r-mid+)*;
cdq(l,mid,A,B);
cdq(mid+,r,A+ll,B+ll);
for(int i=;i<ll;i++)tmp[i]=B[i];
mul(A,B+ll,B,ll,rr);
add(B,tmp,ll);
mul(A,A+ll,A,ll,rr);
}
void delete_zero(char s[]){
int i,j;
tot--;
for(i=tot;i>=;i--){
if(s[i]!='')break;
}
s[i+]=;
j=i;
for(i=;i<j;i++,j--)swap(s[i],s[j]);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&bs[i]);
}
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
cdq(,n,A,B);
//for(int i=0;i<=n<<1;i++)printf("%d ",B[i]);
for(int i=;i<=n<<;i++){
for(int j=;j<;j++){
out[tot++]=B[i]%+'';
B[i]/=;
}
}
//delete_zero(out);
int i,j;
tot--;
for(i=tot;i>=;i--){
if(out[i]!='')break;
}
out[i+]=;
j=i;
for(i=;i<j;i++,j--)swap(out[i],out[j]);
puts(out);
return ;
}

(2016北京集训十)【xsy1529】小Q与进位制 - 分治FFT的更多相关文章

  1. 【XSY1529】小Q与进位制 分治 FFT

    题目大意 ​ 小Q发明了一种进位制,每一位的变化范围是\(0\)~\(b_i-1\),给你一个这种进位制下的整数\(a\),问你有多少非负整数小于\(a\).结果以十进制表示. ​ \(n\leq 1 ...

  2. (2016北京集训十)【xsy1528】azelso - 概率期望dp

    北京集训的题都是好题啊~~(于是我爆0了) 注意到一个重要的性质就是期望是线性的,也就是说每一段的期望步数可以直接加起来,那么dp求出每一段的期望就行了... 设$f_i$表示从$i$出发不回到$i$ ...

  3. (2016北京集训十)【xsy1530】小Q与内存

    一道很有意思的神题~ 暴力平衡树的复杂度很对(并不),但是$2^{30}$的空间一脸屎 这题的正解是一个类似线段树的数据结构,我觉得很有创新性Orz 首先可以想到一种暴力就是用一个点代表一个区间,然后 ...

  4. (2016北京集训十四)【xsy1556】股神小D - LCT

    题解: 题解居然是LCT……受教了 把所有区间按照端点排序,动态维护目前有重叠的区间,用LCT维护即可. 代码: #include<algorithm> #include<iostr ...

  5. 2016北京集训 小Q与进位制

    题目大意 一个数每一位进制不同,已知每一位的进制,求该数的十进制表达. 显然有 $$Ans=\sum\limits_{i=0}^{n-1}a_i \prod\limits_{j=0}^{i-1}bas ...

  6. (2016北京集训十四)【xsy1557】task

    题解: 限制可以看成图状结构,每个任务的对物品数量的影响可以看成权值,只不过这个权值用一个五元组来表示. 那么题意要求的就是最大权闭合子图,网络流经典应用. 代码: #include<algor ...

  7. (2016北京集训十二)【xsy1542】疯狂求导

    题解: 这题看起来很难...但是实际上并没有想象中的那么难 第一眼看上去不会求导公式怎么办?不要紧,题目背景非常良心的给出了题目中的导数计算公式 求完导合并同类项很恶心怎么办?不要紧,样例解释说明了不 ...

  8. 【2019北京集训测试赛(七)】 操作 分治+FFT+生成函数

    题目大意:你有$n$个操作和一个初始为$0$的变量$x$. 第$i$个操作为:以$P_i$的概率给$x$加上$A_i$,剩下$1-P_i$的概率给$x$乘上$B_i$. 你袭击生成了一个长度为$n$的 ...

  9. [2016北京集训测试赛5]小Q与内存-[线段树的神秘操作]

    Description Solution 哇真的异常服气..线段树都可以搞合并和拆分的啊orzorz.神的世界我不懂 Code #include<iostream> #include< ...

随机推荐

  1. RocketMQ学习笔记(11)----RocketMQ的PushConsumer和PullConsumer

    1. PushConsumer 推,Broker主动向Consumer推消息,它Consumer的一种,应用通常向对象注册一个Listener接口,一旦接收到消息,Consumer对象立刻回调Lins ...

  2. C++的头文件(转)

    这几天在写比较困难的一部分,所以也没有时间总结一些东西了,不过昨天翻我的笔记本,发现了一篇还不错的笔记,给大家看看. C/C++头文件一览 C.传统 C++ #include <assert.h ...

  3. ZBrush中如何实现智能对称

    ZBrush软件智能化和人性化的工作流程让用户在创作中提高工作效率,体验创作乐趣,说起智能化不得不提的就是ZBrush 4R8®给我们提供的智能对称功能,所谓的智能对称就是当您在编辑其中一半的物体模型 ...

  4. 路飞学城Python-Day20

    [31.面向对象的软件开发与作业介绍] 1.面向对象分析(object oriented analysis ,OOA) 软件工程中的系统分析阶段,要求分析员和用户结合在一起,对用户的需求做出精确的分析 ...

  5. Django Views Decorator

    Django的试图函数的装饰器主要有: HTTP请求方法 条件视图处理 GZip压缩 改变页眉 缓存 官网文档 HTTP请求方法 该装饰器是设置允许访问HTTP协议的方法,装饰器在django.vie ...

  6. docker 镜像的导入导出

    今天使用docker部署asp.net core应用程序时,发现当我们做好基础镜像之后需要把镜像导出到正式环境,因此学习了一下如何从docker中导出镜像: 1.首先通过docker images命令 ...

  7. python_传递任意数量的实参

    '''def name(*args): #python创建一个空元组,将收到的所有值都封装在这个元组中 """打印所有姓名""" for i ...

  8. JavaScript 实现简单的 弹出框关闭框

    JavaScript 实现简单的 弹出框关闭框 知识点: 1.javaScript 添加HTML标签 2.javaScript 添加HTML标签属性 3.javaScript 追加元素 代码献上: & ...

  9. 20121124.Nodejs创建HTTP程序.md

    ####1.源代码: var http=require('http');//读取http模块    http.createServer(function(req,res){//创建一个服务,接受一个回 ...

  10. IBASE4J开发环境搭建

    1.修改STS默认编码,Window > Perference > General > Workspace,将 text file encoding 设置为 UTF-8 2.打开 G ...