bzoj 2721(线性筛)(约数个数)
2017-10-18 19:20
211 查看
传送门
题解:
设y=n!+t,化简后知x=(n!)^2/t+n!。
所以求(n!)^2的约数个数即可。
约数个数公式:
若x=(p1^k1)*(p2^k2)*...*(pm*km),则x的约数个数d(x)=(k1+1)*(k2+1)*...*(km+1)
所以后面枚举每个预先线性筛筛出的质数,计算它的k,由于是(n!)^2,所以每一个质数的贡献是ki*2+1,最后乘起来即可。
复杂度是个好问题,实测出来大概是3n?我觉得应该是1~n每个数分解质因数后的质因数指数之和?
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=1e6+4;
const ll MOD=1e9+7;
int n;
int prime[MAXN],cnt[MAXN],tot=0,ans=1;
bool vis[MAXN];
inline void linear_shaker() {
for (register int i=2;i<MAXN;++i) {
if (!vis[i]) prime[++tot]=i;
for (int j=1;j<=tot&&i*prime[j]<MAXN;++j) {
vis[i*prime[j]]=true;
if (i%prime[j]==0) break;
}
}
prime[++tot]=MOD;
}
int main() {
linear_shaker();
scanf("%d",&n);
// int clo=0;
for (int i=1;prime[i]<=n;++i)
for (int j=prime[i];j<=n;j+=prime[i])
for (int k=j;k%prime[i]==0;k/=prime[i])
++cnt[i];//,++clo;
for (int i=1;i<=tot;++i)
ans=1ll*ans*(cnt[i]<<1|1)%MOD;
printf("%d\n",ans);
// printf("time==%d\n",clo);
return 0;
}
题解:
设y=n!+t,化简后知x=(n!)^2/t+n!。
所以求(n!)^2的约数个数即可。
约数个数公式:
若x=(p1^k1)*(p2^k2)*...*(pm*km),则x的约数个数d(x)=(k1+1)*(k2+1)*...*(km+1)
所以后面枚举每个预先线性筛筛出的质数,计算它的k,由于是(n!)^2,所以每一个质数的贡献是ki*2+1,最后乘起来即可。
复杂度是个好问题,实测出来大概是3n?我觉得应该是1~n每个数分解质因数后的质因数指数之和?
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=1e6+4;
const ll MOD=1e9+7;
int n;
int prime[MAXN],cnt[MAXN],tot=0,ans=1;
bool vis[MAXN];
inline void linear_shaker() {
for (register int i=2;i<MAXN;++i) {
if (!vis[i]) prime[++tot]=i;
for (int j=1;j<=tot&&i*prime[j]<MAXN;++j) {
vis[i*prime[j]]=true;
if (i%prime[j]==0) break;
}
}
prime[++tot]=MOD;
}
int main() {
linear_shaker();
scanf("%d",&n);
// int clo=0;
for (int i=1;prime[i]<=n;++i)
for (int j=prime[i];j<=n;j+=prime[i])
for (int k=j;k%prime[i]==0;k/=prime[i])
++cnt[i];//,++clo;
for (int i=1;i<=tot;++i)
ans=1ll*ans*(cnt[i]<<1|1)%MOD;
printf("%d\n",ans);
// printf("time==%d\n",clo);
return 0;
}
相关文章推荐
- 【BZOJ-2721】樱花 线性筛 + 数学
- bzoj 2721: [Violet 5]樱花 (线性筛+质因数分解)
- 【bzoj 1968】[Ahoi2005]COMMON 约数研究(线性筛约数个数)
- BZOJ 1968 AHOI2005 COMMON 约数研究 线性筛
- BZOJ 1968 AHOI 2005 COMMON 约数研究 线性筛/暴力
- 【BZOJ2721】[Violet 5]樱花 线性筛素数
- [BZOJ 2721] [Violet 5] 樱花 【线性筛】
- bzoj 1968: [Ahoi2005]COMMON 约数研究 (线性筛求约数个数)
- BZOJ2721 樱花 [线性筛]
- [BZOJ1968][Ahoi2005]COMMON 约数研究(线性筛)
- bzoj 2721: [Violet 5]樱花 线性筛
- 2721: [Violet 5]樱花 思路题 线性筛素数
- 【bzoj3994】[SDOI2015]约数个数和
- BZOJ 1968: [Ahoi2005]COMMON 约数研究 水题
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)
- 【BZOJ3656】异或【扩展Lucas】【线性无关】
- bzoj 4407: 于神之怒加强版 (反演+线性筛)
- [bzoj 1968][Ahoi2005]COMMON 约数研究
- 数学 线性筛约数个数和,约数和
- BZOJ 3529: [Sdoi2014]数表 数学 + 莫比乌斯反演 + 取模优化 + 线性筛 + 树状数组