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

我直接把后面那个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. Oracle 修改数据库表数据提交之后进行回滚

    --查看历史数据 select * from test1 as of timestamp to_timestamp('2018-12-23 14:41:00', 'yyyy-mm-dd hh24:mi ...

  2. 【译】Six Open Source Dashboards to Organize Your Data

    作者:Ben Gregory on Jun 29, 2016   译者:carsonzhu 在天文学家看来,我们相信每个组织都可以从数据的正确集中,组织和清理中受益. 我们正在建立一个公司来做到这一点 ...

  3. eclipse 部署项目

  4. python数据结构与算法第十天【插入排序】

    1.插入排序的原理 2.代码实现 def insert_sort(alist): # 从第二个位置,即下标为1的元素开始向前插入 for i in range(1, len(alist)): # 从第 ...

  5. JMeter 连接 sql server

    1.安装驱动 http://www.microsoft.com/zh-CN/download/details.aspx?id=11774 下载后解压后复制sqljdbc.jar到 “jmeter的安装 ...

  6. LODOP循环多任务 同模版只设置不同队列任务名

    LODOP中从PRINT_INIT(或PRINT_INITA)到最后PRINT(或PREVIEW等),是一个任务,关于Lodop中一个任务,以及一个任务中可以包含哪些语句,详细可查看本博客另一篇博文: ...

  7. Hadoop Brief

    Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储. [1]  Hadoop实现了一个分布 ...

  8. Microsoft Azure Machine Learning Studio

    随着机器学习(ML)成为软件行业的主流,重要的是要了解它的工作原理,并将其置于开发栈中.了解如何为您的应用程序构建ML服务,您可以确定您的ML应用程序中的机会,实施ML,并与您的团队的ML专业人士清楚 ...

  9. 两种从spring容器获取bean方式

  10. Nginx 接受上游缓存流程

    L:101 这个指令主要是由上游服务器来决定是否缓存 详见博客Nginx 针对上游服务器缓存