传送门

就是传说中的任意模数卷积嘛……有三模数NTT和拆系数FFT等做法,我比较懒不想动脑子,就用了三模数NTT的做法……

卷积之后每个数可以达到$10^{23}$左右的级别,直接long double或者__float128都会炸精度(而且__float128炸得更惨……好像是转换的时候掉精度太多……)。而这个模数又不能NTT(首先这就不是个质数……),因此直接搞是行不通的。

我们可以选三个满足NTT性质并且乘起来$>10^{23}$的模数分别NTT,最后中国剩余定理合并。但注意到$10^{23}>2^{64}$,因此直接合并会炸long long,所以我们就需要一些tricky的办法来合并。

我们得到的是这样的三个同余式:

\begin{equation}Ans\equiv a_1\pmod{m_1}\\Ans\equiv a_2\pmod{m_2}\\Ans\equiv a_3\pmod{m_3}\end{equation}

先用中国剩余定理合并前两个同余式,得到

\begin{equation}Ans\equiv A{\pmod M}\\Ans\equiv a_3\pmod{m_3}\end{equation}

不妨设

\begin{equation}Ans=kM+A=xm_3+a_3\end{equation}

我们可以在$\bmod m_3$的意义下求解k的值,那么有

\begin{equation}kM\equiv a_3-A\pmod{m_3}\end{equation}

(因为是在$\bmod m_3$的意义下,所以$xm_3$被消掉了)

也就是说

\begin{equation}k\equiv (a_3-A)M^{-1}\pmod{m_3}\end{equation}

求出$k$之后代入$Ans=kM+A$,这次只要在$\bmod 23333333$的意义下算出$Ans$的值即可。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=,m1=,m2=,m3=,g=,Mod=;
const long long M=(long long)m1*m2;
void NTT(int*,int,int,int);
int China(int,int,int);
int qpow(int,int,int);
long long mul(long long,long long,long long);
int n,N=,A[maxn],B[maxn],C[maxn],D[maxn],a[][maxn];
int main(){
freopen("annona_squamosa.in","r",stdin);
freopen("annona_squamosa.out","w",stdout);
scanf("%d",&n);
while(N<(n<<))N<<=;
for(int i=;i<n;i++)scanf("%d",&A[i]);
for(int i=;i<n;i++)scanf("%d",&B[i]);
copy(A,A+N,C);
copy(B,B+N,D);
NTT(C,N,,m1);
NTT(D,N,,m1);
for(int i=;i<N;i++)a[][i]=(long long)C[i]*D[i]%m1;
NTT(a[],N,-,m1);
copy(A,A+N,C);
copy(B,B+N,D);
NTT(C,N,,m2);
NTT(D,N,,m2);
for(int i=;i<N;i++)a[][i]=(long long)C[i]*D[i]%m2;
NTT(a[],N,-,m2);
copy(A,A+N,C);
copy(B,B+N,D);
NTT(C,N,,m3);
NTT(D,N,,m3);
for(int i=;i<N;i++)a[][i]=(long long)C[i]*D[i]%m3;
NTT(a[],N,-,m3);
for(int i=;i<n;i++)printf("%d\n",China(a[][i],a[][i],a[][i]));
return ;
}
void NTT(int *A,int n,int tp,int p){
for(int i=;i<n;i++)A[i]%=p;
for(int i=,j=,k;i<n-;i++){
k=n;
do j^=(k>>=);while(j<k);
if(i<j)swap(A[i],A[j]);
}
for(int k=;k<=n;k<<=){
int wn=qpow(g,(tp>?(p-)/k:(p-)/k*(long long)(p-)%(p-)),p);
for(int i=;i<n;i+=k){
int w=;
for(int j=;j<(k>>);j++,w=(long long)w*wn%p){
int a=A[i+j],b=(long long)w*A[i+j+(k>>)]%p;
A[i+j]=(a+b)%p;
A[i+j+(k>>)]=(a-b+p)%p;
}
}
}
if(tp<){
int inv=qpow(n,p-,p);
for(int i=;i<n;i++)A[i]=(long long)A[i]*inv%p;
}
}
int China(int a1,int a2,int a3){
long long A=(mul((long long)a1*m2%M,qpow(m2%m1,m1-,m1),M)+mul((long long)a2*m1%M,qpow(m1%m2,m2-,m2),M))%M,k=((a3-A)%m3+m3)%m3*qpow(M%m3,m3-,m3)%m3;
return ((k%Mod)*(M%Mod)%Mod+A%Mod)%Mod;
}
int qpow(int a,int b,int p){
int ans=;
for(;b;b>>=,a=(long long)a*a%p)if(b&)ans=(long long)ans*a%p;
return ans;
}
long long mul(long long a,long long b,long long p){
a%=p;b%=p;
return ((a*b-(long long)((long long)((long double)a/p*b+1e-)*p))%p+p)%p;
}

COGS2294 释迦的更多相关文章

  1. COGS 2294. [HZOI 2015] 释迦

    额,其实就是裸的三模数NTT,上一篇已经说过了 哦,还有一个就是对乘起来炸long long的数取模,用long double之类的搞一下就好,精度什么的,,(看出题人心情??) #include&l ...

  2. C#并行编程系列-文章导航

    菜鸟初步学习,不对的地方请大神指教,参考<C#并行编程高级教程.pdf> 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C# ...

  3. HttpResponseMessage 调用.net web api

    // // GET: /Home/ //释迦苦僧 public ActionResult Index() { HttpClient client = new HttpClient(); client. ...

  4. MVC validate.js下使用 ajaxSubmit

    首页定义验证实体 using System.ComponentModel.DataAnnotations; using System.Web.Mvc; namespace MvcApplication ...

  5. SQL 2014 AlwaysOn 搭建

    AlwaysOn底层依然采用Windows 故障转移群集的机制进行监测和转移,因此也需要先建立Windows Cluster,只不过可用性组中的数据库不一定非要再存放在共享存储上了.可以是存储在本地磁 ...

  6. 悟透JavaScript

    要理解JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原.前面说过,编程世界只有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系.JavaScript就是把数据和代码都简化 ...

  7. 悟透JavaScript(理解JS面向对象的好文章)

    引子 编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力. 数据天生就是文静的,总想保持自己固有的本色:而代码却天生活泼,总想改变这个 ...

  8. OutputCache属性详解(一)一Duration、VaryByParam

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

  9. OutputCache属性详解(二)一 Location

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

随机推荐

  1. loj #6032. 「雅礼集训 2017 Day2」水箱 线段树优化DP转移

    $ \color{#0066ff}{ 题目描述 }$ 给出一个长度为 \(n\) 宽度为 \(1\) ,高度无限的水箱,有 \(n-1\) 个挡板将其分为 \(n\) 个 \(1 - 1\) 的小格, ...

  2. tableView下沉

    出现问题的界面如下,并附有大致介绍: 而我想做的界面应该是自定义的headerView和tableView是一起滑动的,而不是headerView在tableView滑动的时候始终在顶部位置,而且ta ...

  3. AC自动机模板题

    AC自动机学习博客 AC自动机理解要点: 1)fail指针指向的是每个节点,在字典树上和这个节点后缀相同的最长单词,每次都这样匹配,必定不会漏过答案. 2)字典树建立后,会在bfs求fail阶段把字典 ...

  4. Oracle 常用语句备份

    1.oracle 11g 用户名和密码默认区分大小写,可更改alter system set sec_case_sensitive_logon=false 设置改为不区分大小写. 2.授权创建视图:G ...

  5. SQL chema的新增和修改

    1.先要创建你自己的schema create schema myschema 2. alter schema myschema transfer  ado.User    --执行完后,User表就 ...

  6. 转 zabbix 用户建立和中文化

    1. 1 登陆和配置用户   简介 本章你会学习如何登陆Zabbix,以及在Zabbix内建立一个系统用户. 登陆 这是Zabbix的“欢迎”界面.输入用户名 Admin 以及密码 zabbix 以作 ...

  7. hive DML

    1.load files into tables 把文件中的数据加载到表中(表必须先建好) 语法是: load data [local] inpath 'filepath' [overwrite] i ...

  8. RMQ(求区间最值问题)

    学习博客:https://blog.csdn.net/qq_31759205/article/details/75008659 RMQ(Range Minimum/Maximum Query),即区间 ...

  9. android actionbar viewpager 实现类微信主界面布局

    1 Activity public class MainActivity extends FragmentActivity { private ViewPager pager; private Act ...

  10. vim实战:插件安装(Vundle,NerdTree)

    一:插件管理器Vundle 1.简介 Vundle是vim的一个插件管理器, 同时它本身也是vim的一个插件.插件管理器用于方便.快速的安装.删除.Vim更新插件.vim Vundle插件官方地址:h ...