http://172.20.6.3/Problem_Show.asp?id=2043

最开始用了FFT,交上去全tle和wa了(tle的比较多),测了一组数据发现求逆元的过程爆double了(毕竟系数的指数幂也是指数增长的,科学计数法也撑不住)。

然后问了出题人,发现出题人忘了给用来%的P(想用钢丝球刷出题人QnQ),所以其实是ntt,改完ntt加了个快读a了。

题解:http://blog.miskcoo.com/2015/05/polynomial-division

依然是推式子,系数反转求也是很神奇。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<complex>
  7. using namespace std;
  8. #define LL long long
  9. const int maxn=;
  10. const LL P=(LL)**(<<)+;
  11. LL a[maxn],b[maxn],e[maxn],h[maxn],zz[][maxn];
  12. int bel[maxn]={},s,bt,tot=;
  13. inline void getit(){ for(int i=;i<s;++i)bel[i]=((bel[i>>]>>)|((i&)<<(bt-))); }
  14. LL mpow(LL x,LL k){
  15. if(k<){x=mpow(x,P-);k=-k;}
  16. LL z=;
  17. while(k){
  18. if(k&)z=(z*x)%P;
  19. x=(x*x)%P;k/=;
  20. }
  21. return z;
  22. }
  23. inline void fft(LL * c,int n,int dft){
  24. for(int i=;i<n;++i)if(bel[i]>i)swap(c[i],c[bel[i]]);
  25. for(int step=;step<n;step<<=){
  26. LL w=mpow(,((P-)/(step<<))*dft);
  27. for(int j=;j<n;j+=(step<<)){
  28. LL z=;
  29. for(int i=j;i<j+step;++i){
  30. LL x=c[i],y=(c[i+step]*z)%P;
  31. c[i]=(x+y)%P;c[i+step]=((x-y)%P+P)%P;
  32. z=(z*w)%P;
  33. }
  34. }
  35. }
  36. if(dft==-){
  37. LL nm=mpow(n,P-);
  38. for(int i=;i<n;++i)c[i]=(c[i]*nm)%P;
  39. }
  40. }
  41. void dofft(LL *c,LL *d,int x,int y){
  42. int n=x+y-;s=;bt=;
  43. for(;s<n;++bt)s<<=;getit();
  44. fft(c,s,);fft(d,s,);
  45. for(int i=;i<s;++i)c[i]=(c[i]*d[i])%P;
  46. fft(c,s,-);fft(d,s,-);
  47. }
  48. void doit(int n,int m){
  49. if(m==){ ++tot; zz[tot][]=mpow(b[],P-); return; }
  50. int siz=(m+)/; doit(n,siz); ++tot;
  51. for(int i=;i<siz;++i){zz[tot][i]=(zz[tot-][i]*)%P;e[i]=zz[tot-][i];}
  52. for(int i=;i<min(m,n);++i)h[i]=b[i];//cout<<zz[tot-1][0]<<m<<endl;
  53. dofft(zz[tot-],e,siz,siz);siz=siz+siz-;//cout<<zz[tot-1][0]<<m<<endl;
  54. dofft(zz[tot-],h,siz,min(m,n));
  55. for(int i=;i<m;++i)zz[tot][i]=((zz[tot][i]-zz[tot-][i])%P+P)%P;
  56. //for(int i=0;i<m;++i)cout<<zz[tot][i]<<' ';cout<<endl;
  57. }
  58. LL mread(){
  59. LL x=,f=; char ch=getchar();
  60. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  61. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  62. return x*f;
  63. }
  64. int main(){
  65. //freopen("a.in","r",stdin);
  66. int n,m;scanf("%d%d",&n,&m);
  67. for(int i=;i<n;++i){a[n-i-]=mread();a[n-i-]=(a[n-i-]%P+P)%P;}
  68. for(int i=;i<m;++i){b[m-i-]=mread();b[m-i-]=(b[m-i-]%P+P)%P;}
  69. doit(m,n-m+);
  70. dofft(zz[tot],a,n-m+,n);
  71. for(int i=n-m;i>=;--i){printf("%lld ",zz[tot][i]);}printf("\n");
  72. for(int i=n-m+;i<s;++i)zz[tot][i]=;
  73. for(int i=;i<=n-m;++i){if(i>=n-m-i)break;swap(zz[tot][i],zz[tot][n-m-i]);}
  74. for(int i=;i<n;++i){if(i>=n-i-)break;swap(a[i],a[n-i-]);}
  75. for(int i=;i<m;++i){if(i>=m-i-)break;swap(b[i],b[m-i-]);}
  76. dofft(b,zz[tot],m,n-m+);
  77. for(int i=;i<m-;++i){a[i]=((a[i]-b[i])%P+P)%P;}
  78. for(int i=;i<m-;++i){printf("%lld ",a[i]);}printf("\n");
  79. return ;
  80. }

JZYZOJ 2043 多项式除法和取余 NTT 多项式的更多相关文章

  1. uva 10494 - If We Were a Child Again 大数除法和取余

    uva 10494 - If We Were a Child Again If We Were a Child Again Input: standard inputOutput: standard ...

  2. (高精度运算4.7.27)UVA 10494 If We Were a Child Again(大数除法&&大数取余)

    package com.njupt.acm; import java.math.BigInteger; import java.util.Scanner; public class UVA_10494 ...

  3. Edu CF 103 Div. 2 (A. K-divisible Sum, B. Inflation贪心),被黑客攻了,,惨掉rank, 思维除法与取余, 不太擅长的类型

    2021-01-29 题目链接: Educational Codeforces Round 103 (Rated for Div. 2) 题目 A. K-divisible Sum You are g ...

  4. 【learning】多项式相关(求逆、开根、除法、取模)

    (首先要%miskcoo,这位dalao写的博客(这里)实在是太强啦qwq大部分多项式相关的知识都是从这位dalao博客里面学的,下面这篇东西是自己对其博客学习后的一些总结和想法,大部分是按照其博客里 ...

  5. Re.多项式除法/取模

    前言 emmm又是暂无 前置 多项式求逆 多项式除法/取模目的 还是跟之前一样顾名思义] 给定一个多项式F(x),请求出多项式Q(x)和R(x),满足F(x)=Q(x)∗G(x)+R(x),R项数小于 ...

  6. 洛谷.4512.[模板]多项式除法(NTT)

    题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...

  7. 2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

    题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展g ...

  8. C++ int型负数除法取余问题

    1:关于除法,不管是正数还是负数都是向0取整的:10/4 = 2,10/(-4) = -2 2:负数取余,通过取模来判定 |小| % |大| = |小| 符号同前    |大| % |小| = |余| ...

  9. BigInteger实现除法取余

    BigInteger实现除法取余 BigInteger是什么? Java中,整形的最大范围是64位的long型整数.但是如果我们使用的整数超过了64位呢?这时候就用到了BigInteger.BigIn ...

随机推荐

  1. Python3.x文件处理详解

    Python3.x文件处理详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 任何一门语言都有其特有的操作文件的方式,Python2.x版本有两种操作文件的方式,没错就是open函 ...

  2. 高级篇 KZ002.反射读取注解[未封装]

    创建自定义注解 package com.hanpang.java; /** * 注解说明: 方法的文档注释 * * @Author: 胖先生 * @Create: 2016-04-27 10:29 * ...

  3. nodemon:让node自动重启

    nodemon:服务器自动重启工具 当我们修改代码时,node必须要手动重启,但可以按照nodemon. npm install -g nodemon 安装完 nodemon 后,就可以用 nodem ...

  4. 【转载】视频CDN技术原理与流程说明

    视频CDN专为移动互联网视频内容分发量身定做的一套自主研发的分布式平台,该平台以深圳为中心,分布在全国各地BGP机房的服务器为边缘节点,汇聚中国电信.中国联通.中国移动.中国教育网等运营商网络资源,构 ...

  5. git 学习小记之记住https方式推送密码

    昨天刚刚学了点git基础操作,但是不幸的是Git@OSC给出公告说尽量使用 https 进行操作.可是在用 https 进行 push 时,都需要输入帐号和密码. 各种百度谷歌之后在Git@OSC官网 ...

  6. ASP.NET自定义服务器控件

    本文通过创建一个最简单的服务器控件,演示开发服务器端控件的流程. 文章内容整理自MSDN的编程指南,原文地址在文章末尾的资源中. 本文创建一个简单的服务器控件,名为 RedLabel. 它的使用方式为 ...

  7. svn使用笔记

    一.checkout:第一次下载trunk里面的代码到本地 二.commit:提交一些修改* out of date : 本地版本号 < 服务器版本号* 如果过期,就update,可能会出现co ...

  8. 多源复制遇到CREATE USER FAILED错误

    MySQL Multi-Source Replication enables a replication slave to receive transactions from multiple sou ...

  9. C++ socket 网络编程 简单聊天室

    操作系统里的进程通讯方式有6种:(有名/匿名)管道.信号.消息队列.信号量.内存(最快).套接字(最常用),这里我们来介绍用socket来实现进程通讯. 1.简单实现一个单向发送与接收 这是套接字的工 ...

  10. string替换所有指定字符串(C++)

    C++的string提供了replace方法来实现字符串的替换,但是对于将字符串中某个字符串全部替换这个功能,string并没有实现,我们今天来做的就是这件事. 首先明白一个概念,即string替换所 ...