题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1965

推式子就同这里:https://www.cnblogs.com/yoyoball/p/9196092.html

一开始想设 \( g(n,j) = \sum\limits_{i=1}^{n} [ min(i) >= p_{j} ] f(i) \),其中 \( f(i) = d(i)  \mu(i) \) 或 \( f(i) = mu(i) \),\( d(i) \) 是质因子个数;

结果发现枚举最小质因子还好(但是太慢了会TLE啊!),改成循环来筛的话很不好赋初值啊!而且筛的过程也感觉怪怪的,弄了半天还是不对...

于是就也把 \( g(n,j) \) 设成 \( g(n,j) = \sum\limits_{i=1}^{n} [ i \in prime || min(i) >= p_{j} ] f(i) \) 了,果然就对了...

这里因为 \( d(i) \mu(i) \) 不是积性函数,所以要考虑 \( d(i) \) 少加的部分,再补回来即可(就是加一个 \( \sum \mu(i) \) );

long double 快速乘;

注意多组数据!虽然也不用清空什么数组,但因为我在过程中用到了 \( s[m+1] \) 和 \( sum[m+1] \),所以要把这两个清零。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
typedef long double ld;
int const xn=1e6+;
ll const mod=1e12+,md=mod-;
int m,pri[xn],cnt,sqr;
ll n,w[xn],h[xn],s[xn],ps[xn],sum[xn],f[xn],g[xn];
bool vis[xn];
ll upt(ll x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
ll upt2(ll x){while(x>=md)x-=md; while(x<)x+=md; return x;}
/*
ll mul(ll a,ll b){ll ret=0; for(;b;b>>=1,a=upt(a+a))if(b&1)ret=upt(ret+a); return ret;}
ll mul2(ll a,ll b){ll ret=0; for(;b;b>>=1,a=upt2(a+a))if(b&1)ret=upt2(ret+a); return ret;}
*/
ll mul(ll a,ll b){ll r=(ld)a*b/mod; return a*b-r*mod;}
ll mul2(ll a,ll b){ll r=(ld)a*b/md; return a*b-r*md;}
ll pw(ll a,ll b){ll ret=; for(;b;b>>=,a=mul(a,a))if(b&)ret=mul(ret,a); return ret;}
ll pw2(ll a,ll b){ll ret=; for(;b;b>>=,a=mul2(a,a))if(b&)ret=mul2(ret,a); return ret;}
void init(int mx)
{
for(int i=;i<=mx;i++)
{
if(!vis[i])pri[++cnt]=i,ps[cnt]=upt2(ps[cnt-]+i);
for(int j=;j<=cnt&&(ll)i*pri[j]<=mx;j++)
{
vis[i*pri[j]]=;
if(i%pri[j]==)break;
}
}
}
int Id(ll x)
{
if(x>sqr)return n/x;
return m-x+;
}
ll F(ll x,int y)
{
if(pri[y]>x)return ;
ll ret=upt2(-h[Id(x)]+y-);
for(int i=y;i<=cnt&&(ll)pri[i]*pri[i]<=x;i++)
ret=upt2(ret-F(n/pri[i],i+));
return ret;
}
ll G(ll x,int y)
{
if(pri[y]>x)return ;
ll ret=upt2(-h[Id(x)]+y-);
for(int i=y;i<=cnt&&(ll)pri[i]*pri[i]<=x;i++)
ret=upt2(ret-G(n/pri[i],i+)-F(n/pri[i],i+));
return ret;
}
int main()
{
int T; scanf("%d",&T); init(1e6);
while(T--)
{
scanf("%lld",&n); sqr=sqrt(n); m=;//
int up; for(up=cnt;(ll)pri[up]*pri[up]>n;up--);
for(ll i=,j;i<=n;i=j+)
{
w[++m]=n/i; j=n/w[m];
h[m]=w[m]-;
if(w[m]&)sum[m]=mul2((w[m]+)/,w[m]);
else sum[m]=mul2(w[m]/,(w[m]+));
s[m]=upt2(sum[m]-);
}
s[m+]=; sum[m+]=;//!!!
for(int j=;j<=up;j++)
for(int i=;i<=m&&(ll)pri[j]*pri[j]<=w[i];i++)
{
int k=Id(w[i]/pri[j]);
h[i]=upt2(h[i]-h[k]+(j-));
s[i]=upt2(s[i]-mul2(s[k],pri[j]));
s[i]=upt2(s[i]+mul2(ps[j-],pri[j]));//pri[j]
}
//for(int i=1;i<=m;i++)printf("sum[%d]=%lld ",i,sum[i]); puts("");
//for(int i=1;i<=m;i++)printf("s[%d]=%lld ",i,s[i]); puts("");
ll res=;
for(ll i=,j;i<=n;i=j+)
{
j=n/(n/i);
res=upt2(res+mul2(sum[Id(n/i)],upt2(s[Id(j)]-s[Id(i-)])));//s[m+1]!
}
for(int i=;i<=up;i++)
res=upt2(res-mul2(pri[i],sum[Id(n/pri[i])]));
ll ans=pw(,res);
for(int i=;i<=up;i++)
for(ll k=,p0=pri[i];p0<=n;p0*=pri[i],k++)
{
ll r=upt2(mul2(p0,sum[Id(n/p0)])-mul2(p0*pri[i],sum[Id(n/p0/pri[i])]));//sum[m+1]!
ans=mul(ans,pw(k+,r));
}
//ans=mul(ans,pw(2,G(n,1)));
/*
for(int i=1;i<=m;i++)
{
//if(w[i]>sqr)f[i]=g[i]=upt2(-(h[Id(n)]-h[i]+1));
//else f[i]=g[i]=upt2(-(h[Id(n)]-up));
if(h[i]<=up)f[i]=g[i]=upt2(-(h[Id(n)]-up));
else f[i]=g[i]=upt2(-(h[Id(n)]-h[i]+1));
}
for(int j=up;j;j--)
for(int i=1;i<=m&&(ll)pri[j]*pri[j]<=w[i];i++)
{
int k=Id(w[i]/pri[j]);
f[i]=upt2(f[i]-f[k]-1);//mu[pj]
g[i]=upt2(g[i]-g[k]-1-f[k]-1);
}
*/
for(int i=;i<=m;i++)f[i]=g[i]=upt2(-h[i]);
for(int j=up;j;j--)
for(int i=;i<=m&&(ll)pri[j]*pri[j]<=w[i];i++)
{
int k=Id(w[i]/pri[j]);
f[i]=upt2(f[i]-f[k]-j);
g[i]=upt2(g[i]-g[k]-j-f[k]-j);
}
ans=mul(ans,pw(,g[Id(n)]));
printf("%lld\n",ans);
}
return ;
}

51nod 1965 奇怪的式子 —— min_25筛的更多相关文章

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

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

  2. 【51NOD1965】奇怪的式子 min_25筛

    题目描述 给你\(n\),求 \[ \prod_{i=1}^n{\sigma_0(i)}^{i+\mu(i)} \] 对\({10}^{12}+39\)取模. \(\sigma_0(i)\)表示约数个 ...

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

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

  4. 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( ...

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

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

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

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

  7. 【51nod1965】奇怪的式子

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

  8. 【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, ...

  9. Min_25 筛 学习笔记

    原文链接https://www.cnblogs.com/zhouzhendong/p/Min-25.html 前置技能 埃氏筛法 整除分块(这里有提到) 本文概要 1. 问题模型 2. Min_25 ...

随机推荐

  1. AppLocker Pro FAQ

    How to use AppLocker Pro: 1. Start AppLocker Pro, create a password.2. In the main console, click &q ...

  2. sem学习

    关键字的选取搜索引擎营销的关键字选取是非常重要的一步,合适的关键字可以为企业带来可观的咨询量.关键字一般分4种,品牌词,产品词,行业词,竞品词,对于这四类词不同的推广策略有着不同的侧重点,根据市场情况 ...

  3. 摘录:MINA 框架简介

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(然,也可以提供JAVA 对象的序列化服务.虚拟机管道通信服务等),Mi ...

  4. 爬虫第六篇:scrapy框架爬取某书网整站爬虫爬取

    新建项目 # 新建项目$ scrapy startproject jianshu# 进入到文件夹 $ cd jainshu# 新建spider文件 $ scrapy genspider -t craw ...

  5. LeetCode第[42]题(Java):Trapping Rain Water (数组方块盛水)——HARD

    题目:接雨水 难度:hard 题目内容: Given n non-negative integers representing an elevation map where the width of ...

  6. 求中位数,O(n)的java实现【利用快速排序折半查找中位数】

    查找无序数组的中位数,要想时间复杂度为O(n)其实用计数排序就能很方便地实现,在此讨论使用快速排序进行定位的方法. 1.中位数定义 2.算法思想 3.Java代码实现 4.时间复杂度分析 5.附录 中 ...

  7. IFE 2015_spring task0002 自学记录

    JavaScript数据类型及语言基础 1. 判断arr是不是一个数组,返回一个bool值. 首先javascript有5大基本数据类型:Undefined,Null,Boolean,Number和S ...

  8. python迭代器与生成器(二)

      一.什么是迭代? 迭代通俗的讲就是一个遍历重复的过程. 维基百科中 迭代(Iteration) 的一个通用概念是:重复某个过程的行为,这个过程中的每次重复称为一次迭代.具体对应到Python编程中 ...

  9. HTTP请求常用状态码

    常见的http请求响应的状态码 一些常见的状态码为: 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务不可用 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状 ...

  10. LeetCode OJ:Best Time to Buy and Sell Stock(股票买卖的最佳时期)

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...