传送门

就是传说中的任意模数卷积嘛……有三模数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. Linux进程间通信——使用System V 消息队列

    消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问 ...

  2. Linux安装Elasticsearch-head插件

    首先需要下载以下内容: 我试验的对应版本:ES:elasticsearch-6.6.1.tar.gz  Node:node-v10.15.3-linux-x64.tar  JDK:jdk-8u201- ...

  3. 使用pageHelper遇到的问题

    在做SSM整合的时候,遇到一个小问题,在我使用pageHelper的时候,分页的效果总是无法正确显示,卡了我几个小时,现在来说一下我的问题.  1.首先导入pageHelper的包: <!--引 ...

  4. python中的try/except/else/finally语句

    与其他语言相同,在python中,try/except语句主要是用于处理程序正常执行过程中出现的一些异常情况,如语法错误(python作为脚本语言没有编译的环节,在执行过程中对语法进行检测,出错后发出 ...

  5. iis上部署本地数据库LocalDB的方法

    1. iis应用程序池的标识设置为"ApplicationPoolIdentify"(比较安全) 2. 不要将数据库物理文件保存在网站的物理路径内,因为iis应用程序池的标识为Ap ...

  6. 《Paxos Made Simple》翻译(转)

    1 Introduction 可能是因为之前的描述对大多数读者来说太过Greek了,Paxos作为一种实现容错的分布式系统的算法被认为是难以理解的.但事实上,它可能是最简单,最显而易见的分布式算法了. ...

  7. XNA 中3D模型的显示

    XNA 中3D模型的显示: ModelMeshPart[] meshParts; Model start_model; Matrix[] dq_model_transforms; Matrix vie ...

  8. VS2010,VS2012,VS2015等的自动提示不能默认选中的功能解决办法

    很简单,只需要按 ctrl+alt+space 即可切换. 蛋疼,我到底为什么总会不小心切换过去,而且每次都记不住这个快捷键切换回来...

  9. ScriptManager.RegisterStartupScript()方法和Page.ClientScript.RegisterStartupScript() 方法详解

    ScriptManager.RegisterStartupScript()方法 如果页面中不用Ajax,cs中运行某段js代码方式可以是: Page.ClientScript.RegisterStar ...

  10. gson日期转换问题

    转:http://blog.csdn.net/liao_leo/article/details/44593095 今天遇到个很奇怪的问题,gson解析日期字符串,本地执行可以,服务器上执行就报错. 这 ...