解题关键:快速数论变换NTT模板。

注意$ans$数组的$ans[n]$一定要注意置$0$,或者结果从$n-1$开始遍历,这里很容易出错。

代码1:ACdreamer 的板子。

为什么要reverse序列至今没证明出来。=,=有懂的聚聚可以告诉本渣一下,万分感谢!!~~

经过聚聚们的指导,还是不太懂,最终从wiki上找到了比较易懂的证明~

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=;
ll G=,P=,a[*N],b[*N],wn[];//P是费马素数
char s[N],t[N];
ll mod_pow(ll x,ll n,ll p) {
ll res=;x%=p;
while(n){
if(n&) res=res*x%p;
x=x*x%p;
n>>=;
}
return res;
}
void getwn(){ for(int i=;i<;i++) wn[i]=mod_pow(G,(P-)/(<<i),P);}//预处理w
void NTT(ll x[],int n,int rev){
ll w,u,v;
for(int i=,j=;i!=n;i++){//构造逆序表
if(i>j) swap(x[i],x[j]);
for(int l=n>>;(j^=l)<l;l>>=);
}
for(int i=,ds=;i<n;i<<=,ds++)
for(int j=;j<n;j+=i){
w=;
for(int k=j;k<j+i/;k++,w=w*wn[ds]%P){//蝴蝶操作
u=x[k]%P;v=w*x[k+i/]%P;
x[k]=(u+v)%P;
x[k+i/]=(u-v+P)%P;
}
}
if(rev==-){
for(int i=;i<n/;i++) swap(x[i],x[n-i]);//把开始的wn求逆元合并到这里来了,通过什么性质至今没搞懂。
w=mod_pow(n,P-,P);//乘n的逆元
for(int i=;i<n;i++) x[i]=x[i]*w%P;
}
}
void solve(){
int i,n=,les=(int)strlen(s),let=(int)strlen(t);
while(n<les+let) n<<=;
for(i=;i<les;i++) a[i]=s[les-i-]-'';
for(i=les;i<=n;i++) a[i]=;
for(i=;i<let;i++) b[i]=t[let-i-]-'';
for(i=let;i<=n;i++) b[i]=;
NTT(a,n,);NTT(b,n,);
for (i=;i<n;i++) a[i]=a[i]*b[i]%P;
NTT(a,n,-);
for(i=;i<n;i++)
if(a[i]>=){//if可以不带
a[i+]+=a[i]/;
a[i]%=;
}
while(n>&&!a[n]) n--;
for(;n>=;n--) printf("%lld",a[n]);
printf("\n");
}
int main(){
getwn();
while(scanf("%s%s",s,t)!=EOF) solve();
return ;
}

代码2:

完全按照fft转化而来

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=;
ll G=,P=,a[*N],b[*N],wn[],iwn[];//P是费马素数
char s[N],t[N];
ll mod_pow(ll x,ll n,ll p) {
ll res=;x%=p;
while(n){
if(n&) res=res*x%p;
x=x*x%p;
n>>=;
}
return res;
}
void getwn(){
for(int i=;i<;i++) wn[i]=mod_pow(G,(P-)/(<<i),P);
for(int i=;i<;i++) iwn[i]=mod_pow(wn[i],P-,P);
}//预处理w
void NTT(ll x[],int n,int rev){
ll w,u,v,wm;
for(int i=,j=;i!=n;i++){//构造逆序表
if(i>j) swap(x[i],x[j]);
for(int l=n>>;(j^=l)<l;l>>=);
}
for(int i=,ds=;i<n;i<<=,ds++)
for(int j=;j<n;j+=i){
w=;
if(rev==-) wm=iwn[ds];
else wm=wn[ds];
for(int k=j;k<j+i/;k++,w=w*wm%P){//蝴蝶操作
u=x[k]%P;v=w*x[k+i/]%P;
x[k]=(u+v)%P;
x[k+i/]=(u-v+P)%P;
}
}
if(rev==-){
w=mod_pow(n,P-,P);//乘n的逆元
for(int i=;i<n;i++) x[i]=x[i]*w%P;
}
}
void solve(){
int i,n=,les=(int)strlen(s),let=(int)strlen(t);
while(n<les+let) n<<=;
for(i=;i<les;i++) a[i]=s[les-i-]-'';
for(i=les;i<=n;i++) a[i]=;
for(i=;i<let;i++) b[i]=t[let-i-]-'';
for(i=let;i<=n;i++) b[i]=;
NTT(a,n,);NTT(b,n,);
for (i=;i<n;i++) a[i]=a[i]*b[i]%P;
NTT(a,n,-);
for(i=;i<n;i++)
if(a[i]>=){//if可以不带
a[i+]+=a[i]/;
a[i]%=;
}
while(n>&&!a[n]) n--;
for(;n>=;n--) printf("%lld",a[n]);
printf("\n");
}
int main(){
getwn();
while(scanf("%s%s",s,t)!=EOF) solve();
return ;
}

FFT常用素数P=r*2^k+1,g为P的原根
P r k g
3 1 1 2
5 1 2 2
17 1 4 3
97 3 5 5
193 3 6 5
257 1 8 3
7681 15 9 17
12289 3 12 11
40961 5 13 3
65537 1 16 3
786433 3 18 10
5767169 11 19 3
7340033 7 20 3
23068673 11 21 3
104857601 25 22 3
167772161 5 25 3
469762049 7 26 3
1004535809 479 21 3
2013265921 15 27 31
2281701377 17 27 3
3221225473 3 30 5
75161927681 35 31 3
77309411329 9 33 7

[hdu1402]A * B Problem Plus(NTT)的更多相关文章

  1. FFT/NTT模板 既 HDU1402 A * B Problem Plus

    @(学习笔记)[FFT, NTT] Problem Description Calculate A * B. Input Each line will contain two integers A a ...

  2. 【NTT】hdu1402 A * B Problem Plus

    r·2^k+1 r k g 3 1 1 2 5 1 2 2 17 1 4 3 97 3 5 5 193 3 6 5 257 1 8 3 7681 15 9 17 12289 3 12 11 40961 ...

  3. luoguP1919 A*B Problem升级版 ntt

    luoguP1919 A*B Problem升级版 链接 luogu 思路 ntt模板题 代码 #include <bits/stdc++.h> #define ll long long ...

  4. XJTUOJ wmq的A×B Problem FFT/NTT

    wmq的A×B Problem 发布时间: 2017年4月9日 17:06   最后更新: 2017年4月9日 17:07   时间限制: 3000ms   内存限制: 512M 描述 这是一个非常简 ...

  5. hdu----(1402)A * B Problem Plus(FFT模板)

    A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  6. HDU1402 A * B Problem Plus

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  7. HDU1402 A * B Problem Plus(FFT)

    http://acm.hdu.edu.cn/showproblem.php?pid=1402 初学FFT. http://www.cnblogs.com/WABoss/p/FFT_Note.html ...

  8. HDU1402 A * B Problem Plus FFT

    分析:网上别家的代码都分析的很好,我只是给我自己贴个代码,我是kuangbin的搬运工 一点想法:其实FFT就是快速求卷积罢了,当小数据的时候我们完全可以用母函数来做,比如那种硬币问题 FFT只是用来 ...

  9. HDU-1402 A * B Problem Plus FFT(快速傅立叶变化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1402 一般的的大数乘法都是直接模拟乘法演算过程,复杂度O(n^2),对于这题来说会超时.乘法的过程基本 ...

随机推荐

  1. 《C+编程规范 101条规则、准则与最佳实践》笔记

    <C+编程规范 101条规则.准则与最佳实践> 0.不要拘泥于小节(了解哪些东西不应该标准化) * 与组织内现有编码规范一致即可 * 包括但不限于: - 缩进 - 行长度 - 命名规范 - ...

  2. Ubuntu12.04等的输入法问题 中英文切换 fitcx

    一般乌班图系统安装的时候会提醒大家选择安装的输入法,若大家选择中文安装,那么支持中文没得说,当选择英文安装的时候,发现整个系统环境是英文,并且根本不能输入中文,想baidu一下都是用pinyin百度, ...

  3. F5与Ctrl+F5及地址栏输入地址回车

    按F5等同于点击页面地址栏的刷新图标. 地址栏输入地址然后回车: 根据缓存内容是否过期决定是否发送请求给服务端 F5: 浏览器无论如何都得发送请求给服务端,包含If-Modified-Since/If ...

  4. Android系统Recovery工作原理之使用update.zip升级过程分析(三)【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7464699 以下的篇幅开始分析我们在上两个篇幅中生成的update.zip包在具体更新中所经 ...

  5. 监控MySQL的脚本

    #!/bin/bash res=`netstat -lntup | grep | awk -F '[ :]+' '{print $5}'` " ];then echo "Mysql ...

  6. 算法(Algorithms)第4版 练习 1.3.4

    主要思路: 遇到左括号则一直压栈,遇到右括号时则从栈中弹出一个元素. 如果此时栈为空,则返回false. 如果这个元素与右括号不匹配,则返回false. 重复此过程,最后判断栈是否为空,若为空则返回t ...

  7. Cocos2d-x中常用宏的作用

    1. CC_SYNTHESIZE(int, nTest, Test); 相当于: protected: int nTest; public: virtual nTest getTest(void) c ...

  8. hadoop_异常_01_ Unable to determine address of the host-falling back to "localhost" address java.net.UnknownHostException: rayner

    一.异常现象 安装好hadoop之后,执行格式化namenode命令时,抛出以下异常: // :: WARN net.DNS: Unable to determine local hostname - ...

  9. 在程序中对ArrayList进行排序,并剔除重复元素

    import java.util.*; class sortDemo { public static void main(String[] args) { ArrayList<Object> ...

  10. (转)python调取C/C++的dll生成方法

    本文针对Windows平台下,python调取C/C++的dll文件. 1.如果使用C语言,代码如下,文件名为test.c. __declspec(dllexport) int sum(int a,i ...