【JZOJ5224】【GDOI2018模拟7.12】C
来源:互联网 发布:星际边界mac 编辑:程序博客网 时间:2024/05/18 02:06
Description
Data Constraint
Solution
首先必须讲讲自然数幂求和。
我们设
我们用第一类斯特林数来计算。
第一类Stirling数 s(p,k)
s(p,k)的一个的组合学解释是:将p个物体排成k个非空循环排列的方法数。
s(p,k)的递推公式: s(p,k)=(p-1)*s(p-1,k)+s(p-1,k-1) ,1<=k<=p-1
边界条件:s(p,0)=0 ,p>=1 s(p,p)=1 ,p>=0
递推关系的说明:
考虑第p个物品,p可以单独构成一个非空循环排列,这样前p-1种物品构成k-1个非空循环排列,方法数为s(p-1,k-1)。也可以前p-1种物品构成k个非空循环排列,而第p个物品插入第i个物品的左边,这有(p-1)*s(p-1,k)种方法。
由第一类斯特林数的定义可知
由于我们知道S1(n)=n*(n+1)/2,所以我们可以在O(P *P)的时间内算出Sp(n)。
接下来回归正题。
时间复杂度O(
Code
#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>#define ll long longusing namespace std;const ll maxn=8e6+5,mo=1e9+7,maxn1=maxn-5;ll phi[maxn],h[maxn][2],sk[10],s[10][10];int d[maxn],bz[maxn];ll n,m,i,t,j,k,l,x,y,z,ans,p;ll hash(ll x){ int t=x%maxn; while (h[t][0] && h[t][0]!=x) t=(t+1)%maxn; return t;}ll dg(ll n){ if (n<=maxn1) return phi[n]; ll x=hash(n),t=n%mo,k,i=2,ans=0,y=(mo+1)/2; if (h[x][0]) return h[x][1];h[x][0]=n; ans=t*(t+1)%mo*y%mo; while (i<=n){ t=n/i;k=n/(n/i); ans=ans-(k-i+1)*dg(t)%mo;i=k+1; } h[x][1]=(ans%mo+mo)%mo;return h[x][1];}ll dg1(ll n){ ll x=n%mo,y=(mo+1)/2,p,i,j,k,t; sk[1]=x*(x+1)%mo*y%mo; for (p=2;p<=m;p++){ t=0;x=1; for (j=n-p+1;j<=n+1;j++) if (j%(p+1)==0 && !t) x=(j/(p+1))%mo*x%mo,t++; else x=j%mo*x%mo; for (j=0;j<p;j++){ k=((p-j)%2)?-1:1; x=x-k*s[p][j]*sk[j]%mo; } sk[p]=(x%mo+mo)%mo; } return sk[m];}int main(){// freopen("data.in","r",stdin); scanf("%lld%lld",&n,&m);phi[1]=1; for (i=2;i<=maxn1;i++){ if (!bz[i]) d[++d[0]]=i,phi[i]=i-1; for (j=1;j<=d[0];j++){ if (i*d[j]>maxn1) break; bz[i*d[j]]=1; if (i%d[j]==0){ phi[i*d[j]]=phi[i]*d[j];break; }else phi[i*d[j]]=phi[i]*phi[d[j]]; } } for (i=1;i<=maxn1;i++) phi[i]=(phi[i]+phi[i-1])%mo; s[0][0]=1; for (i=1;i<=m;i++){ for (j=1;j<i;j++) s[i][j]=(s[i-1][j-1]+(i-1)*s[i-1][j])%mo; s[i][i]=1; } i=1; while (i<=n){ x=n/i;t=n/(n/i);y=2*dg(x)%mo-1; ans=ans+(dg1(t)-dg1(i-1)+mo)%mo*y%mo; i=t+1; } ans=ans%mo; printf("%lld\n",ans);}
阅读全文
1 0
- 【JZOJ5224】【GDOI2018模拟7.12】C
- 【jzoj5224】【GDOI2018模拟7.12】【C】【自然数幂和】【杜教筛】
- 【GDOI2018模拟7.12】C
- 【GDOI2018模拟7.10】C
- 【GDOI2018模拟7.10】C
- 【GDOI2018模拟7.10】C
- 【GDOI2018模拟7.12】B
- 【GDOI2018模拟7.12】A
- 【JZOJ5220】【GDOI2018模拟7.10】C
- JZOJ 5224【GDOI2018模拟7.12】C(数论&&杜教筛)
- [JZSC2017]【GDOI2018模拟7.12】总结
- 【JZOJ5222】【GDOI2018模拟7.12】A
- 【GDOI2018模拟7.10】C 动态规划
- 【jzoj5220】【GDOI2018模拟7.10】【C】【动态规划】
- 【JZOJ 5220】【GDOI2018模拟7.10】C
- 【jzoj5223】【GDOI2018模拟7.12】【B】【矩阵乘法】
- 【GDOI2018模拟7.12】B 矩阵乘法+dp
- 【jzoj5222】【GDOI2018模拟7.12】【A】【数据结构】
- POJ 3163 King of Fighters 笔记
- JavaScript中的自定义对象
- 《自然语言计算机形式分析的理论与方法》读书笔记(5)
- JS编程训练 | 题6:数组前插入元素
- Unity3D注册事件和取消注册事件位置
- 【JZOJ5224】【GDOI2018模拟7.12】C
- 三角形的有向面积
- web测试与app测试的区别
- vb.net 教程 20-1 农历 2
- Volley的ImageLoader用法
- hdu 3592 差分约束 first bolld
- java-day02-reflect-Method
- Mongodb查询学习
- 刷题记录-luoguP1801 黑匣子_NOI导刊2010提高(06)