hdu 6134 Battlestation Operational (莫比乌斯反演+线性筛法+差分)
来源:互联网 发布:饥饿游戏知乎 编辑:程序博客网 时间:2024/05/20 14:22
http://acm.hdu.edu.cn/showproblem.php?pid=6134
题目大意:给你一个n,求
解题思路:根据已知公式,可以令
令
而
设gcd(i,j) = d,明显可以知道d能被i整除,当然也可以找到一个k,使得k*d = j,则我们可以得到gcd(i,kd) = d; 我们可以构造
现在我们的任务就是如何求h(i)了,那就要求
令t = i/d;则当 j = t时g(t) = 1 当 t/2<= j< t 时 g(t) = 2 当 t/3<=j < t/2 时 g(t) = 3 由此可以看出在t这个间隔内g(t)的值不会发生变化。这里可以用差分的思想来求g(t)。
具体代码如下:
#include <stdio.h>#include <algorithm>#include <string.h>const int mod = 1e9+7;const int N = 1e6;using namespace std;int mu[N+10],vis[N+10],prime[N+10];int sum[N+10],g[N];int n,m;void get_mu()///线性筛法求mu{ int cnt = 0; memset(mu,0,sizeof(mu));///先让初始值全部赋值为0 mu[1] = 1;///第一个元素为1 memset(vis,0,sizeof(vis)); vis[0] = vis[1] = 1; for(int i=2;i<=N;i++){ if(!vis[i]){ prime[cnt++] = i; mu[i] = -1;///如果这个数是个素数的话则mu【i】 = -1; } for(int j = 0;j < cnt&& i*prime[j]<=N;j++){ vis[i*prime[j]] = 1; if(i%prime[j])///控制这个数由几个不同素数组成 mu[i*prime[j]] = -mu[i]; else{///表示有相同素数组成 mu[i*prime[j]] = 0; break; } } }}void work(){ memset(sum,0,sizeof(sum)); memset(g,0,sizeof(g)); get_mu(); for(int i=1;i<=N;i++){///求g(i) g[i]++; for(int j = i; j <= N; j+=i) g[j+1]++; } for(int i=1;i<=N;i++) g[i] = (g[i-1] + g[i])%mod; for(int i = 1; i <= N; i++){///求h(i) if(mu[i] == 0) continue; for(int j = i; j <= N; j+=i){ if(mu[i] > 0)sum[j] = (sum[j] + g[j/i])%mod; else sum[j] = (sum[j] - g[j/i]+mod)%mod; } } for(int i=1;i<=N;i++) sum[i] = (sum[i] + sum[i-1])%mod;}int main(){ int n; work();// for(int i=1;i<=10;i++)// cout<<mu[i]<<' ';// cout<<endl;// for(int i=1;i<=10;i++)// cout<<g[i]<<' ';// cout<<endl;// for(int i=1;i<=10;i++)// cout<<sum[i]<<' ';// cout<<endl; while(~scanf("%d",&n)){ printf("%d\n",sum[n]); } return 0;}
阅读全文
0 0
- hdu 6134 Battlestation Operational (莫比乌斯反演+线性筛法+差分)
- HDU 6134 Battlestation Operational(莫比乌斯反演+线性筛)
- hdu 6134 Battlestation Operational 莫比乌斯反演
- HDU 6134(2017 多校训练:Battlestation Operational(莫比乌斯反演))
- HDU 6134 Battlestation Operational(积性函数+莫比乌斯反演)
- Battlestation Operational(hdu6134 莫比乌斯反演)
- HDU 6134 Battlestation Operational 莫比乌斯反演 + 数学推导
- HDU 6134 Battlestation Operational 2017多校8 莫比乌斯反演
- HDU 6134 && 2017 多校训练:Battlestation Operational(莫比乌斯反演+积性函数)
- HDU 6134 Battlestation Operational(基本数论+莫比乌斯反演)——2017 Multi-University Training Contest
- 【HDU6134】Battlestation Operational (莫比乌斯反演)
- 【HDU6134】Battlestation Operational(莫比乌斯反演)
- 解题报告:HDU_6134:Battlestation Operational (莫比乌斯反演)
- hdu6134 Battlestation Operational 莫比乌斯反演
- HDU 6134 Battlestation Operational-莫比乌斯
- HDU6134 Battlestation Operational 【莫比乌斯】
- hdu 6134 Battlestation Operational [反演]【数学】
- hdu 6134 Battlestation Operational mobius反演
- NetCDF数据处理
- poj2456二分法
- Redis实现类似同步方法调用的功能(二)
- C++各类设计模式及实现详解
- Linux:linux(centos)之安装tomcat并且部署java web项目
- hdu 6134 Battlestation Operational (莫比乌斯反演+线性筛法+差分)
- 20170818 有赞 电话面试总结
- udp中的connect()&bind()
- ZOJ 3329 One Person Game(概率dp 经典)
- Bear in the Field CodeForces
- 互联网保险创新之二--需求与渠道创新
- nefu84 五指山(扩展欧几里得)
- list的两种循环
- LeetCode-118-Pascal's Triangle(帕斯卡的三角形)