HDU 5663 (莫比乌斯反演)
来源:互联网 发布:java报表 编辑:程序博客网 时间:2024/06/05 16:31
分析:
这道题就是一道公式推导题,我再来推一遍公式:
设
则
这个时候就搞定了,后面一块
然后维护
总的复杂度是
代码:
#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <algorithm>#include <set>#include <map>#include <queue>#include <vector>#include <string>using namespace std;typedef long long LL;typedef vector <int> VI;typedef pair <int,int> PII;#define FOR(i,x,y) for(int i = x;i < y;++ i)#define IFOR(i,x,y) for(int i = x;i > y;-- i)#define pb push_back#define mp make_pair#define fi first#define se second const int maxn = 10000010;int mu[maxn],prime[maxn];bool check[maxn];void Mobius(){ memset(check,false,sizeof(check)); prime[0] = 0; mu[1] = 1; FOR(i,2,maxn){ if(!check[i]) {mu[i] = -1;prime[++prime[0]] = i;} FOR(j,1,prime[0]+1){ if(i*prime[j] > maxn) break; check[i*prime[j]] = true; if(i% prime[j] == 0) {mu[i*prime[j]] = 0;break;} else {mu[i*prime[j]] = -mu[i];} } }}LL sum[maxn];int n,m;LL calc(int x,int y){ LL ans = 0; int i = 1; while(i <= x){ int p = x/i,q = y/i; int j = min(x/p,y/q); ans += (LL)p*q*(sum[j]-sum[i-1]); i = j+1; } return ans;}int main(){ Mobius(); memset(sum,0,sizeof(sum)); FOR(i,1,maxn){ int k = i*i; if(k >= maxn) break; for(int j = k;j < maxn;j += k) sum[j] += mu[j/k]; } FOR(i,1,maxn) sum[i] += sum[i-1]; int T; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); if(n < m) swap(n,m); printf("%I64d\n",(LL)n*m-calc(m,n)); } return 0;}
0 0
- HDU 5663 (莫比乌斯反演)
- hdu 1695 莫比乌斯反演
- hdu 5072 莫比乌斯反演
- hdu 1695 莫比乌斯反演
- hdu 1695 莫比乌斯反演
- HDU 5656 (莫比乌斯反演)
- HDU 4675 (莫比乌斯反演)
- hdu 5212(莫比乌斯反演)
- hdu 1695 莫比乌斯反演
- HDU 1695 莫比乌斯反演
- HDU 6053 莫比乌斯反演
- hdu 6053-莫比乌斯反演
- HDU 6134 莫比乌斯反演
- HDU 6134 莫比乌斯反演
- hdu 6134(莫比乌斯反演)
- HDU 6053 莫比乌斯反演
- hdu 1695 莫比乌斯反演
- HDU 1695 GCD(莫比乌斯反演)
- Java解析处理JSON
- C语言声明字符串的两种方式
- MySQL常用的修改命令
- Android中使用Handler造成内存泄露的分析和解决
- 简单的mvc框架(三)
- HDU 5663 (莫比乌斯反演)
- 【步兵 cocos-js】cc.EditBox 的 快速创建
- Swift3.0获取APP版本号,提示用户升级
- 练习二1017
- oracle学习 第一章 简单的查询语句 ——04
- [线程]——线程同步与锁定2_synchronized
- 项目4——静态成员应用
- java中hashCode方法与equals方法的用法
- hdu 1075 Trie树