传送门

就是传说中的任意模数卷积嘛……有三模数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. P3994 高速公路

    题目链接 题意分析 这是一道树上斜率优化题 首先 \[dp[i]=min\{dp[j]+(dis[i]-dis[j])* p[i]+q[i]\}(j∈Pre_i)\] 那么就是 \[p[i]=\fra ...

  2. HTML-★★★★JavaScript的DOM操作★★★★-重点部分

    Window.document 对象 一.找到元素 document.getElementById("id"); 根据id找,最多找一个: var a = document.get ...

  3. Eclipse中的常见设置

    本文将移到下面的博客维护: 新的博客网址 当新建一个workspace时,习惯做下面的设置: 1. 在eclipse中,默认的Text file encoding是GBK(操作系统是中文简体):如果操 ...

  4. springmvc.xml配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  5. CSS: Multiple Attribute Selector [name="value"][name2="value2"]

    this.document.querySelectorAll('div[id*="dayselector"][class*="x-autocontainer-innerC ...

  6. python __getattribute__、__getattr__、__setattr__详解

    __getattribute__ 官方文档中描述如下: 该方法可以拦截对对象属性的所有访问企图,当属性被访问时,自动调用该方法(只适用于新式类).因此常用于实现一些访问某属性时执行一段代码的特性. 需 ...

  7. PIE_SDK.NET功能表

  8. 使用try-with-resource遇到的问题

    JDK1.7增加了try-with-source语法.在try中声明一个或者多个资源,在try块代码执行完成后自动关闭流,不用再写close()进行手动关闭. try(Resource res = x ...

  9. vue开发的一些设置以及技巧

    引入其它css样式   需要加~   @找到的是src目录 对于常用的路径可以设置别名     @代表src                  常用的地址在webpack.base.conf.js中 ...

  10. Redis的安装(CentOS 7下)

    redis的官网,www.redis.io 1. 先下载 redis: wget http://download.redis.io/releases/redis-3.0.3.tar.gz 2. 解压: ...