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

其实场上我想出了分治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. 「JavaSE 重新出发」05.01.01 equals 方法

    equals 方法示例 // 代码来自<Java核心技术 卷I>P167 // 父类 public class Employee{ ... public boolean equals(Ob ...

  2. 用一个小的例子来说明为什么TCP采用三次握手才能保证连接成功

    关于TCP的三次握手,有很多朋友还在疑惑为什么是三次,而不是两次,LZ想了一下用一个例子来说明最好. 场景: 办公室有一名前台(服务器),若干业务员(fork出来的进程) 客户(客户端)   为什么我 ...

  3. 第十三章 Python并发编程

    并发编程之多进程 python中如果想要充分的利用多核CPU的资源,大部分情况需要使用多进程,python提供了multiprocessing multiprocessing模块用来开启子进程,并在子 ...

  4. Pyhton学习——Day31

    # 服务端和接收端的send和reve没有任何关系,只与协议之间有关系# 应用程序产生的数据一定会交给操作系统,并由操作系统往外发送# 发送端什么时候会清空自己的内存?# 收到接收端的ACK响应以后才 ...

  5. MySQL Reading table information for completion of table and column names

    打开数据库是发现提示: mysql> show databases; +--------------------+ | Database | +--------------------+ | b ...

  6. 如何在React-Native上使用Typescript

    首先安装脚手架: $ yarn global add create-react-native-app 创建项目: create-react-native-app xxx 进入项目并启动: cd xxx ...

  7. nefu 84 ( 拓展欧几里德模板题 )

    链接:传送门 思路:拓展欧几里德模板题,设大圣至少翻转 t 次,大圣起始位置为 x ,大圣目标位置为 y + n * s ( 大圣到达目标位置 y 可能需要多圈,所以用 s 来表示圈数 ),因为只能逆 ...

  8. debian 9 安装无线网卡

    #添加源 echo "deb http://httpredir.debian.org/debian/ stretch main contrib non-free" >> ...

  9. springmvcjson中文乱码处理

    在sping.xml中增加配置信息 <bean class="org.springframework.web.servlet.mvc.method.annotation.Request ...

  10. python_for循环

    #for循环'''for i in range(0,10,2):age_oldboy = 56for i in range(3): guess_age = int(input("guess ...