COGS2294 释迦
就是传说中的任意模数卷积嘛……有三模数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 释迦的更多相关文章
- COGS 2294. [HZOI 2015] 释迦
额,其实就是裸的三模数NTT,上一篇已经说过了 哦,还有一个就是对乘起来炸long long的数取模,用long double之类的搞一下就好,精度什么的,,(看出题人心情??) #include&l ...
- C#并行编程系列-文章导航
菜鸟初步学习,不对的地方请大神指教,参考<C#并行编程高级教程.pdf> 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C# ...
- HttpResponseMessage 调用.net web api
// // GET: /Home/ //释迦苦僧 public ActionResult Index() { HttpClient client = new HttpClient(); client. ...
- MVC validate.js下使用 ajaxSubmit
首页定义验证实体 using System.ComponentModel.DataAnnotations; using System.Web.Mvc; namespace MvcApplication ...
- SQL 2014 AlwaysOn 搭建
AlwaysOn底层依然采用Windows 故障转移群集的机制进行监测和转移,因此也需要先建立Windows Cluster,只不过可用性组中的数据库不一定非要再存放在共享存储上了.可以是存储在本地磁 ...
- 悟透JavaScript
要理解JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原.前面说过,编程世界只有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系.JavaScript就是把数据和代码都简化 ...
- 悟透JavaScript(理解JS面向对象的好文章)
引子 编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力. 数据天生就是文静的,总想保持自己固有的本色:而代码却天生活泼,总想改变这个 ...
- OutputCache属性详解(一)一Duration、VaryByParam
目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...
- OutputCache属性详解(二)一 Location
目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...
随机推荐
- leetcode-575-Distribute Candies(计算一个数组中元素的种类的快速方法)
题目描述: Given an integer array with even length, where different numbers in this array represent diffe ...
- 利用腾讯云为你的域名申请并配置免费SSL一年
我想,点进来的朋友,应该都知道SSL的重要性吧.这里就简单提一下,大型网站域名只有配置了SSL后,才会更加安全. 现在,微信小程序也开始要求后台必须是SSL配置后的域名了.说了这么多,估计有些人还是有 ...
- python高级(三)—— 字典和集合(泛映射类型)
本文主要内容 可散列类型 泛映射类型 字典 (1)字典推导式 (2)处理不存在的键 (3)字典的变种 集合 映射的再讨论 python高级——目录 文中代码均放在github上:https://git ...
- wordcloud词云--可视化
import jieba import wordcloud f = open("新时代中国特色社会主义.txt", "r", encoding="gb ...
- 高阶篇:5)仿真研究Simulation studies
本章目的:了解仿真,初步学会怎么应用仿真. 1.仿真的定义 仿真------就是用模型(物理模型或数学模型)代替实际系统进行实验和研究. 把实际系统建立成物理模型或数学模型进行研究,然后把对模型实 ...
- css实现渐变
.gradient{ background: -webkit-gradient(linear, 0 0, 0 100%, from(#8ca0d3), to(#375a9a)); /** Chrome ...
- 通过遍历类向Aspose.cell模板中插入数据
/// <summary> /// 遍历类所有字段 /// </summary> /// <param name="designer">aspo ...
- linux下获取系统时间 和 时间偏移
获取linux时间 并计算时间偏移 void getSystemTimer(void){#if 0 char *wdate[]={"Sun","Mon",&q ...
- 转如何检查数据库是否处于一致性的状态 以及 如果在DG 库上备份,恢复成一个主库
##sample 0 不完全恢复之后,open resetlogs之前,怎么快速的检查数据库是否处于一致性的状态?https://blog.csdn.net/msdnchina/article/det ...
- $bzoj1021-SHOI2008\ Debt$ 循环的债务 $dp$
题面描述 \(Alice\).\(Bob\)和\(Cynthia\)总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在 ...