解:这又是什么神仙毒瘤题......

我直接把后面那个phi用phi * I = id反演一波,得到个式子,然后推不动了......

实际上第一步我就大错特错了。考虑到n很小,我们有

然后计算S,我们根据欧拉函数的性质有:

于是只考虑n sqr free的情况。

到这里有两种解法,一种是暴力递归。

考虑n的一个因子p,我们先提取出前面那一项,但是这还不够。因为当p|i的时候应该提出来p = phi[p] + 1。

于是我们在后面补上。令i = pt,就有了递归式。

 #include <cstdio>
#include <map> typedef long long LL;
const int N = , T = ;
const LL MO = 1e9 + , INF = 0x7f7f7f7f7f7f7f7fll; int phi[N], p[N], top, last[N];
LL Phi[N], inv2;
bool vis[N]; namespace Hash {
struct Node {
LL val, ans;
int nex;
Node(LL x = , LL y = , int z = ) {
val = x;
ans = y;
nex = z;
}
}node[]; int top;
const int mod = ;
int e[mod];
inline void insert(LL p, LL v) {
int x = p % mod;
node[++top] = Node(p, v, e[x]);
e[x] = top;
return;
}
inline LL find(LL p) {
int x = p % mod;
for(int i = e[x]; i; i = node[i].nex) {
if(node[i].val == p) return node[i].ans;
}
return -INF;
}
} inline void getp(int n) {
phi[] = ;
for(int i = ; i <= n; i++) {
if(!vis[i]) {
p[++top] = i;
phi[i] = i - ;
last[i] = i;
}
for(int j = ; j <= top && i * p[j] <= n; j++) {
vis[i * p[j]] = ;
last[i * p[j]] = p[j];
if(i % p[j] == ) {
phi[i * p[j]] = phi[i] * p[j];
break;
}
phi[i * p[j]] = phi[i] * (p[j] - );
}
}
for(int i = ; i <= n; i++) {
Phi[i] = (Phi[i - ] + phi[i]) % MO;
}
return;
} LL getPhi(LL x) {
if(x <= ) return ;
if(x <= T) return Phi[x];
LL temp = Hash::find(x);
if(temp != -INF) return temp;
//printf("getPhi %lld T = %d\n", x, T);
LL ans = (x % MO) * ((x + ) % MO) % MO * inv2 % MO;
for(LL i = , j; i <= x; i = j + ) {
j = x / (x / i);
ans -= ((j - i + ) % MO) * getPhi(x / i) % MO;
ans = (ans % MO + MO) % MO;
}
Hash::insert(x, ans);
return ans;
} LL S(LL n, LL m) {
//printf("S : %lld %lld \n", n, m);
if(n == ) return getPhi(m);
if(m == ) return ;
if(m == ) return phi[n];
LL p = last[n];
LL ans = (phi[p] * S(n / p, m) % MO + S(n, m / p)) % MO;
return ans;
} int main() {
inv2 = (MO + ) / ;
getp(T);
LL nn, m;
scanf("%lld%lld", &nn, &m);
LL ans = ;
for(int i = ; i <= nn; i++) {
LL p = , q = , n = i;
while(n > ) {
LL temp = last[n];
p *= temp;
n /= temp;
while(n % temp == ) {
n /= temp;
q *= temp;
}
}
ans = (ans + q * S(p, m) % MO) % MO;
}
printf("%lld\n", ans);
return ;
}

TLE

还有一种继续推:

其中d = gcd(i,n)

有个关键点是n是sqr free...否则一直想不明白。

接下来把这个式子带入S的定义式中。

这样就可以递归了。

注意......这个S也可以记忆化的,否则死活过不去。用map。

 #include <cstdio>
#include <map> typedef long long LL;
const int N = , T = ;
const LL MO = 1e9 + , INF = 0x7f7f7f7f7f7f7f7fll; int p[N], last[N], top, phi[N];
LL Phi[N], inv2;
bool vis[N]; std::map<LL, LL> mp[], Hash; inline void getp(int n) {
phi[] = ;
for(int i = ; i <= n; i++) {
if(!vis[i]) {
p[++top] = i;
phi[i] = i - ;
last[i] = i;
}
for(int j = ; j <= top && i * p[j] <= n; j++) {
vis[i * p[j]] = ;
last[i * p[j]] = p[j];
if(i % p[j] == ) {
phi[i * p[j]] = phi[i] * p[j];
break;
}
phi[i * p[j]] = phi[i] * (p[j] - );
}
}
for(int i = ; i <= n; i++) {
Phi[i] = (Phi[i - ] + phi[i]) % MO;
}
return;
} LL getPhi(LL x) {
if(x <= ) return ;
if(x <= T) return Phi[x];
if(Hash.count(x)) return Hash[x];
//printf("Phi %lld \n", x);
LL ans = (x % MO) * ((x + ) % MO) % MO * inv2 % MO;
for(LL i = , j; i <= x; i = j + ) {
j = x / (x / i);
ans -= ((j - i + ) % MO) * getPhi(x / i) % MO;
ans = (ans % MO + MO) % MO;
}
return Hash[x] = ans;
} LL S(int n, LL m) {
//printf("S %d %lld \n", n, m);
if(n == ) return getPhi(m);
if(m == ) return phi[n];
if(m == ) return ;
if(mp[n][m]) return mp[n][m];
LL ans = ;
for(int i = ; i * i <= n; i++) {
if(n % i) continue;
ans += phi[n / i] * S(i, m / i) % MO;
if(i * i < n) {
ans += phi[i] * S(n / i, m / (n / i)) % MO;
}
ans = (ans % MO + MO) % MO;
}
return mp[n][m] = ans;
} int main() {
inv2 = (MO + ) / ;
int nn; LL m;
getp(T);
scanf("%d%lld", &nn, &m);
LL ans = ;
for(int i = ; i <= nn; i++) {
int n = i, p = , q = ;
//printf("i = %d \n", i);
while(n > ) {
int temp = last[n];
n /= temp;
p *= temp;
while(n % temp == ) {
n /= temp;
q *= temp;
}
}
ans += q * S(p, m) % MO;
ans = (ans % MO + MO) % MO;
}
printf("%lld\n", ans);
return ;
}

AC代码

这个时间到底是怎么算的啊......玄学。

BZOJ3512 DZY Loves Math IV的更多相关文章

  1. BZOJ3512 DZY Loves Math IV(杜教筛+线性筛)

    注意到n很小,考虑枚举i.现在要求的是f(n,m)=Σφ(in) (i=1~m).显然当n没有平方因子时,φ(in)=φ(i)·φ(n/gcd(i,n))·gcd(i,n).利用φ*1=id又可得φ( ...

  2. 【BZOJ3512】DZY Loves Math IV(杜教筛)

    [BZOJ3512]DZY Loves Math IV(杜教筛) 题面 BZOJ 求 \[\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\] 其中\(n\le 10^5,m\l ...

  3. BZOJ 3512: DZY Loves Math IV [杜教筛]

    3512: DZY Loves Math IV 题意:求\(\sum_{i=1}^n \sum_{j=1}^m \varphi(ij)\),\(n \le 10^5, m \le 10^9\) n较小 ...

  4. BZOJ3512:DZY Loves Math IV

    传送门 Sol 好神仙的题目.. 一开始就直接莫比乌斯反演然后就 \(GG\) 了 orz 题解 permui 枚举 \(n\),就是求 \(\sum_{i=1}^{n}S(i,m)\) 其中\(S( ...

  5. 【bzoj3512】DZY Loves Math IV 杜教筛+记忆化搜索+欧拉函数

    Description 给定n,m,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}\varphi(ij)\)模10^9+7的值. Input 仅一行,两个整数n,m. Output 仅 ...

  6. ●BZOJ 3512 DZY Loves Math IV

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3512 题解: $$求ANS=\sum_{i=1}^{N}\sum_{j=1}^{M}\phi ...

  7. 【刷题】BZOJ 3512 DZY Loves Math IV

    Description 给定n,m,求 模10^9+7的值. Input 仅一行,两个整数n,m. Output 仅一行答案. Sample Input 100000 1000000000 Sampl ...

  8. bzoj 3512: DZY Loves Math IV

    Description 给定n,m,求 模10^9+7的值. Solution 设 \(S(n,m)\) 表示 \(\sum_{i=1}^{m}\phi(n*i)\) \(Ans=\sum_{i=1} ...

  9. bzoj 3512: DZY Loves Math IV【欧拉函数+莫比乌斯函数+杜教筛】

    参考:http://blog.csdn.net/wzf_2000/article/details/54630931 有这样一个显然的结论:当\( |\mu(n)|==1 \)时,\( \phi(nk) ...

随机推荐

  1. linux的一些基本命令

    一.linux的一些基本命令(使用的是CentOS7系统): 1.创建用户组,创建新用户并添加到用户组 添加用户,添加用户组命令: 增加用户:useradd -d /usr/username -m u ...

  2. flutter中使用svg

    dependencies: flutter_svg: ^0.12.1 flutter packages get import 'package:flutter_svg/flutter_svg.dart ...

  3. python之路--类的约束, 异常处理, MD5, 日志处理

    一 . 类的约束 1. 写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError class Base: # 对子类进行了约束. 必须重写该方法 # 以后上班了. 拿到公司代 ...

  4. SpringMVC配置三大组件

    1.组件扫描器 使用组件扫描器省去在spring容器配置每个Controller类的繁琐. 使用<context:component-scan>自动扫描标记@Controller的控制器类 ...

  5. Best Chrome Extensions

    Best Chrome Extensions chrome://extensions/ # ghelper chrome-extension://cieikaeocafmceoapfogpffaalk ...

  6. static类型的变量

    c语言中变量的储存类型有以下四种 auto  如果没有定义储存类型  默认就是这个类型  比如  int a = 10;  储存类型就是 auto:编译器会跟你定义的位置,以及用途,自动帮你决定使用那 ...

  7. Maven最佳实战

    Maven中内置的隐藏变量: http://www.cnblogs.com/quanyongan/category/471332.html Maven提供了三个隐式的变量可以用来访问环境变量,POM信 ...

  8. Linux 学习 (一) Linux简介

    Linux达人养成计划 I 学习笔记 Linux 内核官网:www.kernel.org 内核版本说明:主版本.次版本.末版本,如2.6.18 Linux 主要发行版本 RedHat: 服务器领域,部 ...

  9. gauss——seidel迭代

    转载:https://blog.csdn.net/wangxiaojun911/article/details/6890282 Gauss–Seidelmethod 对应于形如Ax = b的方程(A为 ...

  10. hdu-6166(最短路+二进制分组)

    题意:给你n个点m条边的有向图,然后再给你k个不同的点,问你这k个点的最小距离: 解题思路:这道题最需要注意的就是k个点一定是不同的,那么有一个结论就是任意两个不同的数字中,在他们的二进制地表示中,一 ...