题目描述

  给你\(n\),求

\[\prod_{i=1}^n{\sigma_0(i)}^{i+\mu(i)}
\]

  对\({10}^{12}+39\)取模。

  \(\sigma_0(i)\)表示约数个数。

题解

  把式子拆成两部分:

\[\prod_{i=1}^n{\sigma_0(i)}^{i+\mu(i)}=\prod_{i=1}^n{\sigma_0(i)}^{i}\prod_{i=1}^n{\sigma_0(i)}^{\mu(i)}
\]

  先看前面这部分

\[\begin{align}
S(n)&=\sum_{i=1}^ni=\frac{n(n+1)}{2}\\
\prod_{i=1}^n\sigma_0(i)^i&=\prod_{p}\prod_{k=1}{(k+1)}^{p^kS(\frac{n}{p^k})-p^{k+1}S(\frac{n}{p^{k+1}})}\\
&=\prod_{p\leq \sqrt n}\prod_{k=1}{(k+1)}^{p^kS(\frac{n}{p^k})-p^{k+1}S(\frac{n}{p^{k+1}})}\times \prod_{p>\sqrt n}2^{pS(\frac{n}{p})}
\end{align}
\]

  前面那个式子可以直接计算,后面那个式子可以用min_25筛筛出质数和,然后套上一个数论分块解决。

  再看后面那部分:

  因为\(i\)的每个质数只出现了一次,所以\(\sigma_0(i)=2^{i\text{的质因子个数}}\)

\[\begin{align}
\prod_{i=1}^n\sigma_0(i)^{\mu(i)}&=\prod_{i=1}^n2^{i\text{的质因子个数}\times \mu(i)}
\end{align}
\]

  然后设

\[\begin{align}
F1_{n,j}&=\sum_{i=2}^n[i\text{为质数或}i\text{的最小因子都不小于}p_j]\mu(i)\times i\text{的质因子个数}\\
F2_{n,j}&=\sum_{i=2}^n[i\text{为质数或}i\text{的最小因子都不小于}p_j]\mu(i)\\
F1_{n,j}&=-([p_j,n]\text{之间的质数个数})-\sum_{i\geq j,p_i^2\leq n}(F1_{\frac{n}{p_i},i+1}+F2_{\frac{n}{p_i},i+1})\\
F2_{n,j}&=-([p_j,n]\text{之间的质数个数})-\sum_{i\geq j,p_i^2\leq n}F2_{\frac{n}{p_i},i+1}\\
\end{align}
\]

  直接上min_25筛就好了。

  乘法取模可以用黑科技,或者__int128

  时间复杂度:\(O(\frac{n^\frac{3}{4}}{\log n})\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<cmath>
#include<functional>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
void sort(int &a,int &b)
{
if(a>b)
swap(a,b);
}
void open(const char *s)
{
#ifndef ONLINE_JUDGE
char str[100];
sprintf(str,"%s.in",s);
freopen(str,"r",stdin);
// sprintf(str,"%s.out",s);
// freopen(str,"w",stdout);
#endif
}
int rd()
{
int s=0,c,b=0;
while(((c=getchar())<'0'||c>'9')&&c!='-');
if(c=='-')
{
c=getchar();
b=1;
}
do
{
s=s*10+c-'0';
}
while((c=getchar())>='0'&&c<='9');
return b?-s:s;
}
void put(int x)
{
if(!x)
{
putchar('0');
return;
}
static int c[20];
int t=0;
while(x)
{
c[++t]=x%10;
x/=10;
}
while(t)
putchar(c[t--]+'0');
}
int upmin(int &a,int b)
{
if(b<a)
{
a=b;
return 1;
}
return 0;
}
int upmax(int &a,int b)
{
if(b>a)
{
a=b;
return 1;
}
return 0;
}
const ll p=1000000000039;
const ll p1=1000000000038;
ll mul(ll a,ll b)
{
return (__int128)a*b%p;
// a%=p;
// b%=p;
// return (a*b-(ll)((long double)a/p*b+1e-8)*p)%p;
}
ll mul1(ll a,ll b)
{
return (__int128)a*b%p1;
// a%=p1;
// b%=p1;
// return (a*b-(ll)((long double)a/p1*b+1e-8)*p1)%p1;
}
ll fp(ll a,ll b){ll s=1;for(;b;b>>=1,a=mul(a,a))if(b&1)s=mul(s,a);return s;}
ll fp1(ll a,ll b){ll s=1;for(;b;b>>=1,a=mul1(a,a))if(b&1)s=mul1(s,a);return s;}
const int M=350010;
const int m=350000;
ll n;
ll sq;
int b[M],pri[M],cnt;
ll f1[M],f2[M],g1[M],g2[M];
void init()
{
for(int i=2;i<=m;i++)
{
if(!b[i])
pri[++cnt]=i;
for(int j=1;j<=cnt&&i*pri[j]<=m;j++)
{
b[i*pri[j]]=1;
if(i%pri[j]==0)
break;
}
}
pri[cnt+1]=m+1;
}
ll s[50];
void gao()
{
for(int i=2;i<=m;i++)
{
f1[i]=(ll)(i+2)*(i-1)/2%p1;
g1[i]=i-1;
}
for(int i=1;n/i>m;i++)
{
f2[i]=((n/i)&1?mul1((n/i-1)/2,(n/i+2)):mul1((n/i+2)/2,(n/i-1)));
g2[i]=n/i-1;
}
for(int i=1;i<=cnt;i++)
{
int j;
ll x1=f1[pri[i]-1];
ll x2=g1[pri[i]-1];
for(j=1;n/j/pri[i]>m&&n/j>=(ll)pri[i]*pri[i];j++)
{
f2[j]=(f2[j]-pri[i]*(f2[j*pri[i]]-x1))%p1;
g2[j]-=g2[j*pri[i]]-x2;
}
for(;n/j>m&&n/j>=(ll)pri[i]*pri[i];j++)
{
f2[j]=(f2[j]-pri[i]*(f1[n/j/pri[i]]-x1))%p1;
g2[j]-=g1[n/j/pri[i]]-x2;
}
for(j=m;j>=(ll)pri[i]*pri[i];j--)
{
f1[j]=(f1[j]-pri[i]*(f1[j/pri[i]]-x1))%p1;
g1[j]-=g1[j/pri[i]]-x2;
}
}
}
pll getf(ll x,int y)
{
if(x<=1||x<pri[y])
return pll();
ll s1=-((x<=m?g1[x]:g2[n/x])-g1[pri[y]-1]);
ll s2=s1;
for(int i=y;i<=cnt&&(ll)pri[i]*pri[i]<=x;i++)
{
pll v=getf(x/pri[i],i+1);
s1=(s1-v.first-v.second)%p1;
s2-=v.second;
}
return pll(s1,s2);
}
ll get(ll x)
{
return x<=m?f1[x]:f2[n/x];
}
ll sum(ll x)
{
return x&1?mul1((x+1)/2,x):mul1(x/2,x+1);
}
void solve()
{
scanf("%lld",&n);
sq=0;
while((sq+1)*(sq+1)<=n)
sq++;
memset(s,0,sizeof s);
gao();
pll res=getf(n,1);
s[2]=(s[2]+res.first)%p1;
for(ll i=1,j;i<=n;i=j+1)
{
j=n/(n/i);
if(j>sq)
s[2]=(s[2]+mul1(get(j)-get(max(i-1,sq)),sum(n/i)))%p1;
}
for(int i=1;i<=cnt&&(ll)pri[i]*pri[i]<=n;i++)
{
ll s1=pri[i],s2=(ll)pri[i]*pri[i];
for(int j=1;s1<=n;s1=s2,s2*=pri[i],j++)
s[j+1]=(s[j+1]+mul1(s1,sum(n/s1))-mul1(s2,sum(n/s2)))%p1;
}
ll ans=1;
for(int i=2;i<=50;i++)
{
s[i]=(s[i]+p1)%p1;
ans=mul(ans,fp(i,s[i]));
}
ans=(ans+p)%p;
printf("%lld\n",ans);
}
int main()
{
open("51nod1965");
init();
int t;
scanf("%d",&t);
while(t--)
solve();
return 0;
}

【51NOD1965】奇怪的式子 min_25筛的更多相关文章

  1. 51nod 1965 奇怪的式子——min_25筛

    题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1965 考虑 \( \prod_{i=1}^{n}\sigma_0^i \) \ ...

  2. 51nod 1965 奇怪的式子 —— min_25筛

    题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1965 推式子就同这里:https://www.cnblogs.com/yoyo ...

  3. 51nod1965. 奇怪的式子(min_25筛)

    题目链接 http://www.51nod.com/Challenge/Problem.html#!#problemId=1965 题解 需要求的式子显然是个二合一形式,我们将其拆开,分别计算 \(\ ...

  4. 【51NOD1847】奇怪的数学题 min_25筛

    题目描述 记\(sgcd(i,j)\)为\(i,j\)的次大公约数. 给你\(n\),求 \[ \sum_{i=1}^n\sum_{j=1}^n{sgcd(i,j)}^k \] 对\(2^{32}\) ...

  5. 51nod1847 奇怪的数学题 (Min_25筛+第二类斯特林数)

    link \(\sum_{i=1}^n\sum_{j=1}^n\mathrm{sgcd}(i,j)^k=\sum_{p=1}^ns(p)^k\sum_{i=1}^n\sum_{j=1}^n[\gcd( ...

  6. [51nod1965]奇怪的式子

    noteskey 怎么说,魔性的题目...拿来练手 min_25 正好...吧 首先就是把式子拆开来算贡献嘛 \[ANS=\prod_{i=1}^n \sigma_0(i)^{\mu(i)} \pro ...

  7. 【51nod1965】奇怪的式子

    Portal --> 51nod1965 Solution 怎么说呢..这题..做的有点痛苦.. 首先看这个式子长得..比较奇怪,指数里面那个加号有点烦人,而且这个函数不是一个积性函数也有点烦人 ...

  8. 【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)

    [51NOD 1847]奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数) 题面 51NOD \[\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j)^k\] 其中\( ...

  9. 【UOJ448】【集训队作业2018】人类的本质 min_25筛

    题目大意 给你 \(n,m\),求 \[ \sum_{i=1}^n\sum_{x_1,x_2,\ldots,x_m=1}^i\operatorname{lcm}(\gcd(i,x_1),\gcd(i, ...

随机推荐

  1. SAP QA32 做使用决策系统报错:分类数据的不一致性=>交易终止

    SAP QA32 做使用决策系统报错:分类数据的不一致性=>交易终止 QA32,对如下检验批做处理,系统报错, 试图使用MSC3N去显示这个批次主数据,同样报错, 原因在于批次的分类数据产生后, ...

  2. java 线程方法 ---- join()

    class MyThread2 implements Runnable{ @Override public void run() { for (int i = 0; i < 5; i++){ S ...

  3. 案例解析|政府信息化的BI建设应用 .

    一.行业背景 某建设厅综合监管信息化平台,是政企业务协同的平台之一,同时兼具协作.门户.办公应用集成.用户权限管理等多项功能.在此要求基础上,选择中间件基础技术平台,可以在最大程度满足平台功能需求的前 ...

  4. iOS-----------设置自定义字体

    1.将字体加入到项目中 2.在info.plist文件中加入相应信息,这一步实际上实在项目的Info页里面增加Fonts provided by application项,并设置相应的ttf文件进去, ...

  5. C++ 11 创建和使用共享 weak_ptr

    1.为什么需要weak_ptr? 在正式介绍weak_ptr之前,我们先来回忆一下shared_ptr的一些知识.我们知道shared_ptr是采用引用计数的智能指针,多个shared_ptr实例可以 ...

  6. 07-Vue的基础使用

    vue的介绍 前端框架和库的区别 nodejs的简单使用 vue的起步 指令系统 组件的使用 过滤器的使用 watch和computed 钩子函数 渐进式的JavaScript框架 vue react ...

  7. ORACLE中如何查找定位表最后DML操作的时间小结

    在Oracle数据库中,如何查找,定位一张表最后一次的DML操作的时间呢? 方式有三种,不过都有一些局限性,下面简单的解析.总结一下. 1:使用ORA_ROWSCN伪列获取表最后的DML时间 ORA_ ...

  8. AngularJS学习之旅—AngularJS 服务(八)

    1.AngularJS 服务(Service) AngularJS 中你可以创建自己的服务,或使用内建服务.2.什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 Angular ...

  9. js 学习之路4:js运行/输出中文乱码问题解决

    网上找了一个简单的例子,编写出来很简单,但是乱码的问题稍微困扰了一下. 题目: 1. 大马驮2石粮食,中马驮1石粮食,两头小马驮一石粮食,要用100匹马,驮100石粮食,该如何调配? js解决代码: ...

  10. 重装助手教你如何禁用Windows 10快速启动

    快速启动是首先在Windows 8中实现并延续到Windows 10的功能,可在启动PC时提供更快的启动时间.它是一个方便的功能,也是大多数人在不知情的情况下使用的功能,但还有一些功能会在他们掌握新P ...