洛谷P4725 【模板】多项式对数函数
时间:2019-03-19
本文章向大家介绍洛谷P4725 【模板】多项式对数函数,主要包括洛谷P4725 【模板】多项式对数函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
注释:
$e^x$与$ln(1-x)$的麦克劳林级数:
$e^x=\sum_{i=0}\frac{x^i}{i!}$
$ln(1-x)=-\sum_{i=1}\frac{x^i}{i}$
多项式ln,exp就是用这个定义的
以及,在求ln(y)时的注意点:
令1-x=y,x=1-y,如果y的常数项不为1,那么x的常数项一定不为0。ln(y)=ln(1-x)=$-\sum_{i=1}\frac{x^i}{i}$
x的常数项a对于式子的右侧产生的贡献是$-\sum_{i=1}\frac{a^i}{i}=ln(1-a)$(或者说ln(y)的常数项是这个),当a不为0时这个东西模意义下一般都没办法算
做法:看题解 https://www.luogu.org/problemnew/solution/P4725
设G(x)=ln(F(x))
两边同时求导,得$G'(x)=ln'(F(x))F'(x)=\frac{F'(x)}{F(x)}$
这样可以求出G'(x),积分后得到G(x)除常数项之外的项
常数项怎么办?
根据”注释“的最后一句,G(x)常数项等于模意义下ln(F(x)的常数项),反正F的常数项不为1时,我不会算;刚好题目保证F的常数项为1,那么G(x)常数项就是0
1 #prag\ 2 ma GCC optimize(2) 3 #include<cstdio> 4 #include<algorithm> 5 #include<cstring> 6 #include<vector> 7 #include<cmath> 8 using namespace std; 9 #define fi first 10 #define se second 11 #define mp make_pair 12 #define pb push_back 13 typedef long long ll; 14 typedef unsigned long long ull; 15 const int md=998244353; 16 const int N=131072; 17 int rev[N<<1]; 18 void init(int len) 19 { 20 int bit=0,i; 21 while((1<<(bit+1))<=len) ++bit; 22 for(i=0;i<len;++i) 23 rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1)); 24 } 25 ll poww(ll a,ll b) 26 { 27 ll base=a,ans=1; 28 for(;b;b>>=1,base=base*base%md) 29 if(b&1) 30 ans=ans*base%md; 31 return ans; 32 } 33 void dft(int *a,int len,int idx)//要求len为2的幂 34 { 35 int i,j,k,t1,t2;ll wn,wnk; 36 for(i=0;i<len;++i) 37 if(i<rev[i]) 38 swap(a[i],a[rev[i]]); 39 for(i=1;i<len;i<<=1) 40 { 41 wn=poww(idx==1?3:332748118,(md-1)/(i<<1)); 42 for(j=0;j<len;j+=(i<<1)) 43 { 44 wnk=1; 45 for(k=j;k<j+i;++k,wnk=wnk*wn%md) 46 { 47 t1=a[k];t2=a[k+i]*wnk%md; 48 a[k]+=t2; 49 (a[k]>=md) && (a[k]-=md); 50 a[k+i]=t1-t2; 51 (a[k+i]<0) && (a[k+i]+=md); 52 } 53 } 54 } 55 if(idx==-1) 56 { 57 ll ilen=poww(len,md-2); 58 for(i=0;i<len;++i) 59 a[i]=a[i]*ilen%md; 60 } 61 } 62 void p_inv(int *f,int *g,int len)//g=f^(-1);f,g数组的长度不小于2^(ceil(log2(len))+1)(需要足够长用于临时存放元素) 63 { 64 static int t1[N<<1]; 65 int n1=2; 66 for(;n1<(len<<1);n1<<=1); 67 memset(f+len,0,sizeof(int)*(n1-len)); 68 g[0]=poww(f[0],md-2); 69 for(int i=2,j;i<(len<<1);i<<=1) 70 { 71 init(i<<1); 72 memcpy(t1,f,sizeof(int)*i); 73 memset(t1+i,0,sizeof(int)*i); 74 memset(g+(i>>1),0,sizeof(int)*(i+(i>>1))); 75 dft(t1,i<<1,1);dft(g,i<<1,1); 76 for(j=0;j<(i<<1);++j) 77 g[j]=ll(g[j])*(2+ll(md-g[j])*t1[j]%md)%md; 78 dft(g,i<<1,-1); 79 } 80 memset(g+len,0,sizeof(int)*(n1-len)); 81 } 82 int inv[300011]; 83 inline void p_de(int *f,int len)//derivative求导;f=f' 84 { 85 for(int i=0;i<len-1;++i) 86 f[i]=ll(i+1)*f[i+1]%md; 87 f[len-1]=0; 88 } 89 inline void p_in(int *f,int len)//integral积分;f=?f 90 { 91 for(int i=len-1;i>=1;--i) 92 f[i]=ll(f[i-1])*inv[i]%md; 93 f[0]=0; 94 } 95 void p_ln(int *f,int len)//f=ln(f);f长度满足inv的限制 96 { 97 static int t1[N<<1]; 98 int n1=1,i; 99 while(n1<len) n1<<=1; 100 memset(f+len,0,sizeof(int)*(n1-len)); 101 p_inv(f,t1,n1);p_de(f,n1); 102 init(n1<<1); 103 dft(f,n1<<1,1);dft(t1,n1<<1,1); 104 for(i=0;i<(n1<<1);++i) 105 f[i]=ll(f[i])*t1[i]%md; 106 dft(f,n1<<1,-1); 107 p_in(f,n1); 108 } 109 int a[N<<1]; 110 int n; 111 int main() 112 { 113 int i; 114 inv[1]=1; 115 for(i=2;i<=300000;++i) 116 inv[i]=ll(md-md/i)*inv[md%i]%md; 117 scanf("%d",&n); 118 for(i=0;i<n;++i) 119 scanf("%d",a+i); 120 //for(int iii=1,p=n;iii<=50;++iii) 121 // a[p++]=rand()%md; 122 p_ln(a,n); 123 for(i=0;i<n;++i) 124 printf("%d ",a[i]); 125 return 0; 126 }
- Python 项目实践一(外星人入侵小游戏)第三篇
- WordPress自定义栏目运用实例 VI:设置外链缩略图/特色图像
- Python 项目实践一(外星人入侵小游戏)第二篇
- IBatisNet配置
- WordPress设置评论到达一定数量后自动关闭评论功能
- Python 项目实践一(外星人入侵)第一篇
- 外媒:域名Covermate.com超35万终端交易
- 移除WordPress 管理后台的主题编辑功能
- 百度区域链开放平台“BaaS”启用了二级子域名chain.baidu.com
- Qt界面UI之QML初见(学习笔记四)
- 清新唯美的jQuery天气预报插件(网页天气预报插件)
- 32和64位的CentOS 6.0下 安装 Mono 2.10.8 和Jexus 5.0
- 跨平台的 .NET 运行环境 Mono 3.2 新特性
- Ibatisnet Quick Start
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 批处理模式下运行 top 命令的方法
- 关于CentOs系统自带python和yum卸载后的解决办法
- Linux sftp命令用法总结
- CentOS 7中搭建NFS文件共享存储服务的完整步骤
- centos 7中添加一个新用户并授权的步骤详解
- Linux下Apache HTTP Server 2.4.26安装教程
- 详解linux下查看系统版本号信息的方法(总结)
- 详解Centos8 配置静态IP的实现
- Linux server配置安装Java与Tomcat服务器教程详解
- Ubuntu系统下安装ImageMagick出错的解决过程
- linux 远程控制windows系统下的程序(三种方法)
- 详解Linux上svn命令行批量操作
- 详解linux ntp服务器时间同步设置
- CentOS设置静态IP的方法总结
- ubuntu服务器上快速部署docker的方法