博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[hdu5628]Clarke and math(dirichlet卷积)
阅读量:6906 次
发布时间:2019-06-27

本文共 1206 字,大约阅读时间需要 4 分钟。

狄利克雷卷积定义:\[(f*g)(n)=\sum_{d|n}f(d)*g({\frac n d})\]狄利克雷卷积满足交换律:\[f*g=g*f\]结合律:\[(f*g)*h=f*(g*h)\]还有这么几个性质:\[f*\varepsilon=f\] \[f*1=\sum_{d|n}f(d)\]其中\[1(n)=1,\varepsilon(n)=[n=1]\]我们做这个题就是用的上面那条,题目中的式子可以化成这样:\[1^k*f\]然后快速幂就好了。
代码:

#include
#define ll long longusing namespace std;inline int read(){ int x=0;char ch=' ';int f=1; while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar(); if(ch=='-')f=-1,ch=getchar(); while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*f;}const int p=1e9+7;int n,k;ll a[100001];void dirichlet(ll *ans,ll *f){ memset(a,0,sizeof(a)); for(int i=1;i*i<=n;i++){ a[i*i]=(a[i*i]+ans[i]*f[i])%p; for(int j=i+1;j*i<=n;j++){ a[i*j]=(a[i*j]+ans[i]*f[j])%p; a[i*j]=(a[i*j]+ans[j]*f[i])%p; } } for(int i=1;i<=n;i++)ans[i]=a[i];}ll f[100001],ans[100001],x[100001];void ksm(){ int b=k; while(b){ if(b&1){ dirichlet(ans,x); } dirichlet(x,x); b>>=1; }}void solve(){ for(int i=1;i<=n;i++){ f[i]=read(); x[i]=1; ans[i]=0; } ans[1]=1; ksm(); dirichlet(f,ans); for(int i=1;i

转载于:https://www.cnblogs.com/stone41123/p/7605431.html

你可能感兴趣的文章
知晓设计模式,框架,去提高开发效率,使代码简洁
查看>>
07-OpenLDAP密码审计
查看>>
使用Flex 和 Red5开发简单视频直播功能
查看>>
233
查看>>
第二十一章 任务、线程和同步
查看>>
HtmlDecode 解码 &nbsp;
查看>>
文件共享windows server 2008 服务器
查看>>
软考:两个通用思想
查看>>
初入koa2 -起步
查看>>
java 开发体系参考学习
查看>>
【转】如何阅读android源码
查看>>
Azure系列2.1.4 —— BlobInputStream
查看>>
关于面向对象的理解和类、对象,Java的三大特性
查看>>
1004 成绩排名
查看>>
【转载】【springmvc+mybatis项目实战】杰信商贸-1.项目背景
查看>>
(转)GMap.Net开发之自定义Marker使用方法
查看>>
P1501 [国家集训队]Tree II
查看>>
用ReactNative搭建一个安卓APP
查看>>
rocketmq生产者代码分析
查看>>
[扫雷][游戏] 交互*2
查看>>