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

我直接把后面那个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. java中级——集合框架【3】-HashSet

    HashSet package cn.jse.hashset; import java.util.HashSet; public class TestCollection { public stati ...

  2. elasticsearch介绍,安装,安装错误解决及相应插件安装

    一.elasticsearch介绍 1.简介(使用的是nosql,更新比mongodb慢): ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎, ...

  3. postman+jenkins+newman自动化api接口测试

    一.下载nodejs https://nodejs.org/zh-cn/download/ 二.linux下解压 xz -d node-v8.11.3-linux-x64.tar.xz tar xf ...

  4. DAY08、文件操作

    一.文件操作模式汇总: 主模式: r:读模式 w:写模式(无创建,有清空) a:追加(有创建的功能) x:写,必须自己创建文件,否则报错 从模式: t:文本操作(默认模式)r >rt,w> ...

  5. linux 查看网段内所有IP

    如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ 方法一: nmap –nsP 192.168.1.0/24 #从192.168.1.0到192.168.1.25 ...

  6. Vue簡介

    vue使用由下向上的增量開發模型: vue是javascript的漸進框架: vue的目標是盡量使用簡單的API實現響應的數據綁定和組合的視圖組件.

  7. Python——Flask框架——Web表单

    一.框架Flask-WTF 安装: pip install flask-wtf 需要程序设置一个密钥 app = Flask(__name__) app.config['SECRET_KEY'] = ...

  8. 英特尔DRM内核驱动程序默认启用PSR2省电功能

    导读 英特尔DRM/KMS内核驱动程序很快就会启用PSR2面板自刷新功能,以便在英特尔支持的超极本/笔记本电脑上实现更多节能. 一段时间以来,英特尔的Direct Rendering Manager驱 ...

  9. eclipse中无法查看引用的jar包源码

    本文来源:http://blog.csdn.NET/zljjava/article/details/7545270(这篇博客也是转载的,向最原始的作者致敬) 1.下载JAD jad官方地址的官方下载地 ...

  10. P1200 你的飞碟在这儿

    P1200 题目描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者. 因此,他们要用一种聪明的方案让这些小组提前知道 ...