BZOJ4916 神犇和蒟蒻 【欧拉函数 + 杜教筛】

时间:2022-08-31 23:59:09

题目

很久很久以前,有一只神犇叫yzy;

很久很久之后,有一只蒟蒻叫lty;

输入格式

请你读入一个整数N;1<=N<=1E9,A、B模1E9+7;

输出格式

请你输出一个整数A=\sum_{i=1}^N{\mu (i^2)};

请你输出一个整数B=\sum_{i=1}^N{\varphi (i^2)};

BZOJ4916 神犇和蒟蒻  【欧拉函数 + 杜教筛】

输入样例

1

输出样例

1

1

题解

首先很明显= =

\[ans1 = 1
\]

然后重点是\(ans2\)

我们会发现这样一个性质:

\[\varphi(i^2) = i*\varphi(i)
\]

证明:

\(i^2\)与\(i\)拥有相同的质因子,所以与\(i\)互质的同样与\(i^2\)互质,与\(i\)不互质的同样与\(i^2\)不互质

由于\(gcd(i,j) = gcd(i + i,j)\),且\(i^2 = i * i\),所以\(\varphi(i^2) = i * \varphi(i)\)

【ps:突然发现我傻逼了,直接上\(\varphi\)的计算公式就得证了QAQ】

然后就可以筛了:

我们令

\[f(i) = i * \varphi(i)
\]

拿出杜教筛的套式:

\[g(1) * S(n) = \sum\limits_{i=1}^{n}(f * g)(i) - \sum\limits_{i=2}^{n} g(i) * S(\lfloor \frac{n}{i} \rfloor)
\]

我们企图找出这样一个好算的\(g(i)\)

考虑卷积:

\[(f * g)(n) = \sum\limits_{d|n} g(\frac{n}{d}) * d * \varphi(d)
\]

我们想把\(\varphi(d)\)外的变为常数,这样可以提出来,成为\(\varphi * 1 = Id\)

很容易发现,如果\(g = Id\),那么就刚好可以做到:

\[(Id * f)(n) = \sum\limits_{d|n} \frac{n}{d} * d * \varphi(d) = n * \sum\limits_{d|n} \varphi(d) = n^2
\]

再由:

\[\sum\limits_{i=1}^{n} i^2 = \frac{n * (n + 1) * (2 * n + 1)}{6}
\]

那么杜教筛的式子就化成了:

\[S(n) = \frac{n * (n + 1) * (2 * n + 1)}{6} - \sum\limits_{i=2}^{n} i * S(\lfloor \frac{n}{i} \rfloor)
\]

就可以做了

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 1000005,maxm = 100005,INF = 1000000000,P = 1000000007;
typedef map<LL,LL> Map;
Map _phi;
Map::iterator it;
LL p[maxn],pi,N,n,phi[maxn],v6;
int isn[maxn];
LL qpow(LL a,LL b){
LL ans = 1;
for (; b; b >>= 1,a = a * a % P)
if (b & 1) ans = ans * a % P;
return ans;
}
void init(){
v6 = qpow(6,P - 2);
N = (LL)pow(n,2.0 / 3.0);
phi[1] = 1;
for (LL i = 2; i < N; i++){
if (!isn[i]) p[++pi] = i,phi[i] = i - 1;
for (int j = 1; j <= pi && i * p[j] < N; j++){
isn[i * p[j]] = true;
if (i % p[j] == 0){
phi[i * p[j]] = phi[i] * p[j] % P;
break;
}
phi[i * p[j]] = phi[i] * (p[j] - 1) % P;
}
}
for (LL i = 1; i < N; i++) phi[i] = (i * phi[i] % P + phi[i - 1]) % P;
}
LL S(LL n){
if (n < N) return phi[n];
if ((it = _phi.find(n)) != _phi.end())
return it->second;
LL ans = n * (n + 1) % P * (2 * n + 1) % P * v6 % P;
for (LL i = 2,nxt; i <= n; i = nxt + 1){
nxt = n / (n / i);
ans = (ans - (nxt + i) * (nxt - i + 1) / 2 % P * S(n / i) % P) % P;
}
ans = (ans % P + P) % P;
return _phi[n] = ans;
}
int main(){
cin >> n;
init();
cout << 1 << endl << S(n) << endl;
return 0;
}

BZOJ4916 神犇和蒟蒻 【欧拉函数 + 杜教筛】的更多相关文章

  1. BZOJ4916 神犇和蒟蒻(欧拉函数&plus;杜教筛)

    第一问是来搞笑的.由欧拉函数的计算公式容易发现φ(i2)=iφ(i).那么可以发现φ(n2)*id(n)(此处为卷积)=Σd*φ(d)*(n/d)=nΣφ(d)=n2 .这样就有了杜教筛所要求的容易算 ...

  2. 51nod 1238 最小公倍数之和 V3 【欧拉函数&plus;杜教筛】

    首先题目中给出的代码打错了,少了个等于号,应该是 G=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) { G = (G + lcm(i,j)) % 10000 ...

  3. 51nod 1239 欧拉函数之和【欧拉函数&plus;杜教筛】

    和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\phi(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\phi(i) ...

  4. bzoj 3944&colon; Sum【莫比乌斯函数&plus;欧拉函数&plus;杜教筛】

    一道杜教筛的板子题. 两个都是积性函数,所以做法是一样的.以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1} ...

  5. 51nod 1227 平均最小公倍数【欧拉函数&plus;杜教筛】

    以后这种题能用phi的就不要用mu-mu往往会带着个ln然后被卡常致死 把题目要求转换为前缀和相减的形式,写出来大概是要求这样一个式子: \[ \sum_{i=1}^{n}\sum_{j=1}^{i} ...

  6. 【luogu3768】简单的数学题 欧拉函数&lpar;欧拉反演&rpar;&plus;杜教筛

    题目描述 给出 $n$ 和 $p$ ,求 $(\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\gcd(i,j))\mod p$ . $n\le 10^{10}$ . ...

  7. LG4213 【模板】杜教筛(Sum)和 BZOJ4916 神犇和蒟蒻

    P4213 [模板]杜教筛(Sum) 题目描述 给定一个正整数$N(N\le2^{31}-1)$ 求 $$ans_1=\sum_{i=1}^n\varphi(i)$$ $$ans_2=\sum_{i= ...

  8. BZOJ4916&colon; 神犇和蒟蒻【杜教筛】

    Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你 ...

  9. Bzoj4916&colon; 神犇和蒟蒻

    题面 传送门 Sol 第一问puts("1") 第二问,\(\varphi(i^2)=i\varphi(i)\) 设\(\phi(n)=\sum_{i=1}^{n}i\varphi ...

随机推荐

  1. 如何把select默认的小三角替换成自己的图片

    不同的浏览器默认的select的选项图标是不同的,例如: 在chrome中,是这样的: 未点击时    点击时  在Firefox中是这样的: 未点击时  点击时   在IE9中是这样的: 未点击时  ...

  2. Smallest Common Multiple

    FCC题目:找出能被两个给定参数和它们之间的连续数字整除的最小公倍数. 范围是两个数字构成的数组,两个数字不一定按数字顺序排序. 例如对 1 和 3 -- 找出能被 1 和 3 和它们之间所有数字整除 ...

  3. linux分享六:nohup与&amp&semi;,守护进程

    contab每秒执行脚本,然后将把标准错误重定向到标准输出(2>&1)以追加的方式写入log_cronjob.txt.补充:试想2>1代表什么,2与>结合代表错误重定向,而1 ...

  4. HDU 1753 大明A&plus;B(字符串模拟,简单题)

    简单题,但要考虑一些细节: 前导0不要,后导0不要,小数长度不一样时,有进位时,逆置处理输出 然后处理起来就比较麻烦了. 题目链接 我的代码纯模拟,把小数点前后分开来处理,写的很繁杂,纯当纪念——可怜 ...

  5. Java--Dom解析XML文件

          之前写过几篇关于Java中解析XML文件的方法,不过,感觉不够简单,今天重写了一遍代码,用到的是方法是Dom,其中加入了日志记录功能--Log4j.       好了,不多说了,先把XMl ...

  6. C&num;-Database-连接

    using System.Data; using System.Data.SqlClient; //先打开两个类库文件 SqlConnection con = new SqlConnection(); ...

  7. 纯CSS实现表单验证

    ladies and 乡亲们,表单验证你在做吗?客户端or服务器端,javascript or jquery,动手写 or 使用插件,今天我们来探索下使用纯css实现表单验证,借以学习css sele ...

  8. 安卓程序代写 网上程序代写&lbrack;原&rsqb;ViewGroup&lpar;容器组件&rpar;详解&lpar;API解析&rpar;

    一. ViewGroup简介 1.View和ViewGroup关系 UI组件在Android中的位置 : Android中的UI组件大部分都放在android.widget 或者 android.vi ...

  9. Oracle数据库多行记录转换一行并排序函数

    Oracle数据库多行记录转换一行并排序方法 在ORACLE数据库查询中,我们通常会要求用到将多行记录转换成一行并排序,这时候我们自然会想到Oracle的一个“wx_concat”函数,可以将多行记录 ...

  10. Ansible详解(一)基础安装和配置

    ansible 是一款轻量级自动化运维工具,由的 Python 语言开发,结合了多种自动化运维工具的特性,实现了批量系统配置,批量程序部署,批量命令执行等功能; ansible 是基于模块化实现批量操 ...