【Codeforces1139D_CF1139D】Steps to One (Mobius_DP)
Problem:
Analysis:
After ACing E, I gave up D and spent the left 30 minutes chatting with Little Dino.
Let \(f[n]\) be the expected number of steps needed to make the greatest common divisor (gcd) become \(1\) when the gcd is \(n\) now, and \(g(n,d)\) be the number of \(x(x\in[1,m])\) that \(gcd(x, n)=d\) . So we have:
\]
To make it easy, multiply \(m\) to the equation:
\]
Notice that \(d\) can be \(n\), and \(g(n,n)\) is \(\lfloor\frac{m}{n}\rfloor\), so we have:
\]
Now the problem become how to calculate \(g(n,d)\). According to the defination,
g(n, d)&=\sum_{i=1}^m[gcd(n, i)=d]\\
&=\sum_{i=1}^{\lfloor\frac{m}{d}\rfloor}[gcd(\frac{n}{d},i)=1]\\
&=\sum_{i=1}^{\lfloor\frac{m}{d}\rfloor}\epsilon\left(gcd(\frac{n}{d},i)\right)\\
\end{aligned}
\]
where \(\epsilon(x)=\begin{cases}1\ (x=1)\\0\ \mathrm{otherwise}\end{cases}\) .
According to the Mobius Theorem ( \(\mu * 1 = \epsilon\) ) :
g(n,d)&=\sum_{i=1}^{\lfloor\frac{m}{d}\rfloor}\sum_{t|\frac{n}{d},t|i}\mu(t)\\
&=\sum_{t|\frac{n}{d}}\mu(t)\cdot \lfloor \frac{m}{dt} \rfloor
\end{aligned}
\]
Let's return to \(f[n]\):
\]
Preprocess the divisors of all integer \(x(x\in[1,m])\) and then calculate \(f[n]\) as the equation above directly. Because the number of divisors of most integers is very small ( for integers not more than \(100000\), the maximum is \(128\) and the total number is about \(10^6\) to \(2\times 10^6\)) , so it won't TLE.
At last, the answer is:
\]
Code:
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <vector>
using namespace std;
namespace zyt
{
typedef long long ll;
const int N = 1e5 + 10, p = 1e9 + 7;
vector<int> fac[N];
int n, f[N], pcnt, prime[N], mu[N];
bool mark[N];
void init()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j * j <= i; j++)
if (i % j == 0)
{
fac[i].push_back(j);
if (j * j != i)
fac[i].push_back(i / j);
}
mu[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!mark[i])
prime[pcnt++] = i, mu[i] = p - 1;
for (int j = 0; j < pcnt && (ll)i * prime[j] <= n; j++)
{
int k = i * prime[j];
mark[k] = true;
if (i % prime[j] == 0)
{
mu[k] = 0;
break;
}
else
mu[k] = p - mu[i];
}
}
}
int power(int a, int b)
{
int ans = 1;
while (b)
{
if (b & 1)
ans = (ll)ans * a % p;
a = (ll)a * a % p;
b >>= 1;
}
return ans;
}
int inv(const int a)
{
return power(a, p - 2);
}
int work()
{
scanf("%d", &n);
init();
f[1] = 0;
int ans = 0;
for (int i = 2; i <= n; i++)
{
for (int j = 0; j < fac[i].size(); j++)
{
int d = fac[i][j];
if (d == i)
continue;
int tmp = 0;
for (int k = 0, size = fac[i / d].size(); k < size; k++)
{
int t = fac[i / d][k];
tmp = (tmp + (ll)mu[t] * (n / d / t) % p) % p;
}
f[i] = (f[i] + (ll)tmp * f[d] % p) % p;
}
f[i] = (ll)(f[i] + n) * inv(n - n / i) % p;
}
for (int i = 1; i <= n; i++)
ans = (ans + f[i]) % p;
printf("%d", int(((ll)ans * inv(n) % p) + 1) % p);
return 0;
}
}
int main()
{
return zyt::work();
}
【Codeforces1139D_CF1139D】Steps to One (Mobius_DP)的更多相关文章
- 【CF1139D】Steps to One(动态规划)
[CF1139D]Steps to One(动态规划) 题面 CF 你有一个数组,每次随机加入一个\([1,n]\)的数,当所有数\(gcd\)为\(1\)时停止,求数组长度的期望. 题解 设\(f[ ...
- 【贪心】codeforces D. Minimum number of steps
http://codeforces.com/contest/805/problem/D [思路] 要使最后的字符串不出现ab字样,贪心的从后面开始更换ab为bba,并且字符串以"abbbb. ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- 看懂SqlServer查询计划【转】
原文链接:http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html 开始 SQL Server 查找记录的方法 SQL Server ...
- 【故障处理】ORA-28040: No matching authentication protocol
[故障处理]ORA-28040: No matching authentication protocol 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者 ...
- 【ZZ】 移位贴图 Displacement Mapping
http://blog.csdn.net/huazai434/article/details/5650629 说明:该技术需要VS3.0的支持!!! 一,移位贴图类似于地形渲染.不过由于移位纹理可以做 ...
- 【Android测试】【随笔】模拟双指点击
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5258660.html 手势 看到这个标题,很多人会想一想 ...
- 【转载】看懂SqlServer查询计划
看懂SqlServer查询计划 阅读目录 开始 SQL Server 查找记录的方法 SQL Server Join 方式 更具体执行过程 索引统计信息:查询计划的选择依据 优化视图查询 推荐阅读-M ...
- 【工具】NS2安装记录
献给同样为了NS2抓破了头皮的同志们. 1, Get Started: http://www.isi.edu/nsnam/ns/ns-build.html#allinone Build by piec ...
随机推荐
- nfs 挂载错误
[ 147.080000] svc: failed to register lockdv1 RPC service (errno 146). [ 147.090000] lockd_up: makes ...
- CXF、Spring整合的SOAP Web Service服务端
1.建工程,导入CXFjar包 2.服务接口 package com.cxf.soap; import java.util.List; import javax.jws.WebService; @We ...
- iOS之Prefix.pch
本文转载至 http://blog.csdn.net/lvxiangan/article/details/21325093 Prefix.pch的作用和用法 Hello World_Prefix. ...
- 微信小程序引入外部js 方法
步骤: 1.首先将外部js放在你指定的文件夹里(这都是废话...) 2.接下来 将该js文件中你要使用的方法给暴露出来 3.在您要使用的js中引入该js 4.使用暴露出来的方法 例子:使用md5加密 ...
- (linux)wake_lock机制
Android的休眠唤醒主要基于wake_lock机制,只要系统中存在任一有效的wake_lock,系统就不能进入深度休眠,但可以进行设备的浅度休眠操作.wake_lock一般在关闭lcd.tp但 ...
- YTU 2421: C语言习题 矩形法求定积分
2421: C语言习题 矩形法求定积分 时间限制: 1 Sec 内存限制: 128 MB 提交: 354 解决: 234 题目描述 写一个用矩形法求定积分的通用函数,分别求 (说明: sin,co ...
- 使用JavaScript访问XML数据
在本篇文章中,我们将讲述如何在IE中使用ActiveX功能来访问并解析XML文档,由此允许网络冲浪者操纵它们.这一网页将传入并运行脚本的初始化.你一定确保order.xml文档与jsxml.html在 ...
- codeforces 435 B. Pasha Maximizes 解题报告
题目链接:http://codeforces.com/problemset/problem/435/B 题目意思:给出一个最多为18位的数,可以通过对相邻两个数字进行交换,最多交换 k 次,问交换 k ...
- oracle:rman恢复----通过时间set until time
试验计划:先做一个0级备份,再创建一个表,插入几条数据,最后删除表,然后通过rman把该表的数据恢复. 试验环境:在归档模式,oracle10.2.0.1 开始试验: 1.rman level 0备份 ...
- CollapsingToolbarLayout 收缩显示tilte
final CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id. ...