【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 ...
随机推荐
- u-boot简单学习笔记(二)——AR9331 uboot.lds分析
最开始系统上电后 从uboot.lds开始引导 OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", ...
- alsa声卡切换
环境 ubuntu12.04 因为桌面版的默认装了,而且调声音也很方便,这里说一下server版下的配置,毕竟做开发经常还是用server版的 1.安装 apt-get install alsa-ba ...
- C#高阶与初心:(二)P/Invoke平台调用
最近某个项目要采集交易终端的信息用于监管,主要厂商给出了API,C++版的...开启hard模式!!! C#调用C++的DLL基本就两种方法:加一个VC++项目包一层,或者使用P/Invoke(平台调 ...
- firefox浏览器和IE
http://blog.csdn.net/pipisorry/article/details/40899701 firefox浏览器插件 [下载地址add-ons for firefox]皮皮blog ...
- 回溯法——求解N皇后问题
问题描写叙述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后.使其不能互相攻击,即随意的两个皇后不能处在允许行.同一列,或允许斜线上. 能够把八皇后问题拓展 ...
- python day- 5 字典(dic)的 增删改查 及 操作方法
字典(dic) 1.定义及格式 用{ }大括号括起来的,由key:value 来保存数据的就是 字典(dic) eg:dic = {"及时雨" : "宋江" , ...
- BZOJ 2244: [SDOI2011]拦截导弹 DP+CDQ分治
2244: [SDOI2011]拦截导弹 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截 ...
- How do I set the timeout for a JAX-WS webservice client?
How do I set the timeout for a JAX-WS webservice client? up vote58down votefavorite 27 I've used JAX ...
- 正则表达式pattern的匹配格式
0> 匹配 -------------------------------------------------------------------------------- (pattern) ...
- ZeroMQ 初步认识
http://www.danieleteti.it/zeromq-for-delphi/ https://my.oschina.net/zeroflamy/blog/109457 http://zer ...