神题!

一眼powerful number 复习了一下+推半天。

可以发现G函数只能为\(\sum_{d}[d|x]d\)

不断的推 可以发现最后需要求很多块G函数的前缀和 发现只有\(\sqrt(n)\)的复杂度。

于是自闭了。不过这个做法可以跑过\(1e9\) 第二个subtask没有那么严格所以可以跑过 不过我CE了2333...

也没考虑\(min_25\)筛 可能学的不太精通。。

正解是发现 \(f(n)=(p^{k1}+1)(p^{k2}+1)...\)

然后 将其展开 求每个数字对n的贡献 即枚举上述状态的每一项.

那么在求前缀和中i可以被统计到答案中的标志为存在令一个数字j 满足\(i\cdot j\leq n\)且\((i,j)=1\)

那么其实答案为 \(\sum_{i=1}^n\sum_{j=1}^{\frac{n}{i}}[(i,j)=1]i\)

莫比乌斯反演一下可以得到.

\(\sum_{x=1}^n\mu(x)\sum_{i=1}^{\frac{n}{x}}i\frac{n}{i\cdot x^2}\)

这其实就可以做了。

考虑到\(\frac{n}{i\cdot x^2}\)有值 那么显然 \(x\leq \sqrt n\)

且 \(i\leq \frac{n}{x^2}\)

那么上述式子枚举范围可以变一下.\(\sum_{x=1}^{\sqrt n}\mu(x)\sum_{i=1}^{\frac{n}{x^2}}i\frac{n}{i\cdot x^2}\)

左边暴力枚举 右边整除分块。可以证明这样复杂度为\(\sqrt n\cdot logn\)

可能有点卡常 考虑线性筛出 \(d_n\)表示\(\sum_{i=1}^{n}i\frac{n}{i}\)

考虑右边的实际意义 约数和的前缀和 那么只需要筛出每个数字约数和 再前缀和一下即可。

code
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000000000ll
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(ll i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE ll i=n;i>=p;--i)
#define vep(p,n,i) for(RE ll i=p;i<n;++i)
#define pii pair<ll,ll>
#define mk make_pair
#define RE register
#define P 1000000007
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-4
#define sq sqrt
#define S second
#define F first
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline ll read()
{
RE ll x=0,f=1;RE char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
return x*f;
}
const ll MAXN=4000010;
ll n;
int m,mod,top,INV2;
int p[MAXN],mu[MAXN],v[MAXN],g[MAXN],w[MAXN];
inline void prepare()
{
mu[1]=g[1]=1;
rep(2,m,i)
{
if(!v[i])v[i]=p[++top]=i,w[i]=i,mu[i]=-1;
if(w[i]==i)g[i]=(g[i/v[i]]+i)%mod;
else g[i]=(ll)g[i/w[i]]*g[w[i]]%mod;
rep(1,top,j)
{
if(p[j]>m/i)break;
v[p[j]*i]=p[j];
if(v[i]==p[j])
{
w[p[j]*i]=w[i]*p[j];
break;
}
w[p[j]*i]=p[j];mu[p[j]*i]=-mu[i];
}
}
rep(1,m,i)g[i]=(g[i-1]+g[i])%mod;
}
inline int solve(ll n)
{
if(n<=m)return g[n]*2%mod;
if(n>=mod)
{
ll ww,w1;
int ans=0;
for(ll i=1;i<=n;i=ww+1)
{
w1=n/i;ww=n/w1;
ans=(ans+(i+ww)%mod*((ww-i+1)%mod)%mod*(w1%mod))%mod;
}
return ans;
}
else
{
ll ww,w1;
int ans=0;
for(ll i=1;i<=n;i=ww+1)
{
w1=n/i;ww=n/w1;
ans=(ans+(i+ww)*(ww-i+1)%mod*w1)%mod;
}
return ans;
}
}
signed main()
{
freopen("1.in","r",stdin);
get(n);get(mod);m=(int)sqrt(n*1.0);INV2=(1+mod)>>1;
prepare();int ans=0;
rep(1,m,i)if(mu[i])ans=(ans+mu[i]*(ll)i*solve(n/i/i))%mod;
ans=(ans+mod)%mod;put((ll)ans*INV2%mod);return 0;
}

7.12 NOI模拟赛 积性函数求和 数论基础变换 莫比乌斯反演的更多相关文章

  1. 7.12 NOI模拟赛 生成树 装压dp vector装压

    LINK:生成树 这场比赛我打的真失败 T3是比较容易的 却一直刚 那道"数论" 10分其实搜一下全排列. 30分容易想到对边进行装压dp. 不过存在一些细节 可以对于一个连通块的 ...

  2. 7.12 NOI模拟赛 探险队 期望 博弈 dp 最坏情况下最优策略 可并堆

    LINK:探险队 非常难的题目 考试的时候爆零了 完全没有想到到到底怎么做 (当时去刚一道数论题了. 首先考虑清楚一件事情 就是当前是知道整张地图的样子 但是不清楚到底哪条边断了. 所以我们要做的其实 ...

  3. 【Learning】积性函数前缀和——洲阁筛(min_25写法)

    问题描述 洲阁筛解决的问题主要是\(n\)范围较大的积性函数前缀和. ​ 已知一积性函数\(f(i)\),求\(\sum_{i=1}^nf(i)\). \(n\leq10^{12}\). 求解方法 如 ...

  4. NOI 模拟赛 #2

    得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...

  5. hdu1452 Happy 2004(规律+因子和+积性函数)

    Happy 2004 题意:s为2004^x的因子和,求s%29.     (题于文末) 知识点: 素因子分解:n = p1 ^ e1 * p2 ^ e2 *..........*pn ^ en 因子 ...

  6. HDU 1452 Happy 2004 (逆元+快速幂+积性函数)

    G - Happy 2004 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Subm ...

  7. HDU 1452 Happy 2004(因子和的积性函数)

    题目链接 题意 : 给你一个X,让你求出2004的X次方的所有因子之和,然后对29取余. 思路 : 原来这就是积性函数,点这里这里这里,这里讲得很详细. 在非数论的领域,积性函数指所有对于任何a,b都 ...

  8. HDU1452Happy 2004(高次幂取模+积性函数+逆元)

    题目意思:2004^x的所有正因数的和(S)对29求余:输出结果: 原题链接 题目解析:解析参照来源:点击打开链接 因子和 6的因子是1,2,3,6; 6的因子和是s(6)=1+2+3+6=12; 2 ...

  9. HDU 1452 Happy 2004(因数和+费马小定理+积性函数)

    Happy 2004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

随机推荐

  1. 6.29模拟赛 (T1:李时珍的皮肤衣 T2:马大嘴的废话 T3:SSY的队列 T4:清理牛棚);

    啊,又是考炸的一天,成功的退步了三名,啊,成共的看错了T1  的题意 ,水了80分. 第十五名就是我,额,已经有点倒数的感觉了,并且一道题都没AC  我太难了. 好了,废话不多说了,下面正式提接: 这 ...

  2. 状压DP之吃奶酪

    题目 传送们 思路 1≤n≤15,妥妥的状压,数据这么小, 这道题的状压思路还是很好想的,我们定义f[i][s]代表以i为起点,吃掉状态为s的奶酪所需要跑的最短距离,那么显然,我们先枚举状态s,然后枚 ...

  3. appium-1-安装

    1.appium安装 网盘地址,下载之后,一路点就可以了 链接:https://pan.baidu.com/s/1-X_ceUWisbuyosjztakKZw  密码:hxeu 系统变量中新增APPI ...

  4. day55 js进阶

    目录 引子 一.BOM操作 1 window对象 2 window子对象 3 history对象 4 location对象(掌握) 5 弹出框 6 计时器相关 二.DOM操作 1 查找标签 1.1 直 ...

  5. Docker装的Oracle 11g没有HR用户怎么办?一个脚本解决问题!

    #0x0 问题描述 这个学期有一门Oracle的课,我图省事就直接拉了个docker镜像来做练习,一直倒也没啥问题,但是今天的作业需要用到HR这个模板用户. 然而我执行alter user hr ac ...

  6. java 基本语法(十四)Lambda (一)表达式

    1.Lambda表达式使用前后的对比:举例一: @Test public void test1(){ Runnable r1 = new Runnable() { @Override public v ...

  7. python 并发专题(七):Twisted相关函数以及实现

    一.基础原理 二.基本函数 三.爬虫实现 四.web服务器与客户端实现

  8. 数据可视化之powerBI技巧(十五)采悟:Power BI动态技巧:动态显示数据层级

    今天给大家分享一个动态显示数据层级的技巧,效果如下: 无论想按什么维度.什么顺序查看分析数据,只需要选择不同的切片器组合就行了. 方法如下:01 | 把数据聚合为分析需要的最细粒度 本文假设最细分析粒 ...

  9. Flex移动布局中单行和双行布局的区别以及使用

    这里是单行布局 使用ul>li  来布局 <ul class="local-nav">         <li>             <a  ...

  10. Kafka 信息整理

    请说明什么是传统的消息传递方法? 传统的消息传递方法包括两种: ·排队:在队列中,一组用户可以从服务器中读取消息,每条消息都发送给其中一个人. ·发布-订阅:在这个模型中,消息被广播给所有的用户. 为 ...