hdu4746 Mophues 莫比乌斯
/**
题目:hdu4746 Mophues
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4746
题意:求x,y在给定范围内gcd(x,y)分解素因子的个数<=p的对数。
(n, m, P <= 5×105. Q <=5000).
思路: f(n)表示给定范围内gcd(x,y)==n的对数。
g(n)表示给定范围内gcd(x,y)为n的倍数的对数。 f(n) = sigma[n|d]mu[d/n]*g(d) = sigma[n|d]mu[d/n]*(n/d)*(m/d) ; ans = sigma[1<=x<=min(n,m)]sigma[x|d]mu[d/x]*g(d) = sigma[1<=d<=min(n,m)](g(d)*sigma[x是d的约数]mu[d/x]); sigma[x是d的约数]mu[d/x] 是 g(d)的系数。系数可以用前缀和预处理。 但是本题要求的是gcd(x,y)的分解质因子个数<=p; 所以sigma[x是d的约数]mu[d/x]这里x不仅是d的约数,且要满足x的分解质因子个数<=p (ps:这里的x就是f(n)的n); 定义sum[d]表示 sigma[x是d的约数]mu[d/x], 那么sum[d][num]表示 sigma[x是d的约数,x的分解质因子个数为num]mu[d/x]; 然后处理sum[d][num]表示sum[d][0]~sum[d][num]的前缀和。 然后处理sum[d][num]表示sum[0][num]~sum[d][num]的前缀和。 那么就可以用除法的取值sqrt(N)级别快速计算。 */
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <iostream>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
#define ms(x,y) memset(x,y,sizeof x)
typedef pair<int, int> P;
const LL INF = 1e10;
const int mod = 1e9 + ;
const int maxn = 5e5 + ;
int prime[maxn], tot, not_prime[maxn];
int mu[maxn], sum[maxn][], cnt[maxn];
void mobius()
{
mu[] = ;
tot = ;
for(int i = ; i < maxn; i++){
if(!not_prime[i]){
mu[i] = -;
prime[++tot] = i;
cnt[i] = ;
}
for(int j = ; prime[j]*i<maxn; j++){
not_prime[prime[j]*i] = ;
cnt[prime[j]*i] = cnt[i]+;///cnt[i]表示i这个数分解素因子的个数。
if(i%prime[j]==){
mu[prime[j]*i] = ;
break;
}
mu[prime[j]*i] = -mu[i];
}
} for(int i = ; i < maxn; i++){
for(int j = i; j < maxn; j+=i){
sum[j][cnt[i]] += mu[j/i];
}
} for(int i = ; i < maxn; i++){
for(int j = ; j < ; j++){
sum[i][j] += sum[i][j-];
}
} for(int j = ; j < ; j++){
for(int i = ; i< maxn; i++){
sum[i][j] += sum[i-][j];
}
} }
LL solve(int n,int m,int p)
{
if(n>m) swap(n,m);
LL ans = ;
int last;
for(int i = ; i <= n; i = last+){
last = min(n/(n/i),m/(m/i));
ans += (LL)(sum[last][p]-sum[i-][p])*(n/i)*(m/i);
}
return ans;
}
int main()
{
//freopen("YYnoGCD.in","r",stdin);
//freopen("YYnoGCD.out","w",stdout);
//freopen("in.txt","r",stdin);
int n, m, p;
int T;
mobius();
cin>>T;
while(T--){
scanf("%d%d%d",&n,&m,&p);
if(p>){
printf("%lld\n",(LL)n*m); continue;
}
printf("%lld\n",solve(n,m,p));
}
return ;
}
hdu4746 Mophues 莫比乌斯的更多相关文章
- ACM学习历程—HDU4746 Mophues(莫比乌斯)
Description As we know, any positive integer C ( C >= 2 ) can be written as the multiply of some ...
- hdu4746 Mophues (莫比乌斯进阶)
参考博客:https://blog.csdn.net/acdreamers/article/details/12871643 题意:满足1<=x<=n,1<=y<=m,并且gc ...
- hdu 4746 Mophues 莫比乌斯反演+前缀和优化
Mophues 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其中1<=a<=n, 1<=b<=m) 有Q组数据:(n, m, ...
- HDU 4746 Mophues (莫比乌斯反演应用)
Mophues Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327670/327670 K (Java/Others) Total ...
- hdu4746 Mophues
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4746 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其 ...
- HDU 4746 Mophues 莫比乌斯反演
分析: http://blog.csdn.net/acdreamers/article/details/12871643 分析参见这一篇 http://wenku.baidu.com/view/fbe ...
- HDU 4746 (莫比乌斯反演) Mophues
这道题看巨巨的题解看了好久,好久.. 本文转自hdu4746(莫比乌斯反演) 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其中1<=a<= ...
- Mophues HDU - 4746 (莫比乌斯反演)
Mophues \[ Time Limit: 10000 ms\quad Memory Limit: 262144 kB \] 题意 求出满足 \(gcd\left(a,b\right) = k\), ...
- hdu4746:2013杭州网络赛I 莫比乌斯反演
题意: 有5000组询问,每组询问求有多少i,j满足i∈[1,n],j∈[1,m]且gcd(i,j)的质因子数目<=p. n,m<=500000 思路: 首先预处理出每个数的质因子数目分别 ...
随机推荐
- (剑指Offer)面试题42:翻转单词顺序
题目: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理. 例如输入字符串“I am a student.”,则输出"student. ...
- vb.net 鼠标控制
Public Class Form1 Public Declare Sub mouse_event Lib "user32" Alias "mouse_event&quo ...
- python -c 处理shell字符串
$test="hello world" $python -c "print '$test'.split()[1]" world 或者 $test="h ...
- 使用JNDI连接数据库
第一步:实现一个Java类: package com.logistic.data; import java.sql.*;import javax.sql.*;import javax.naming.* ...
- Jquery重新学习之八[Ajax运用总结B]
上一篇简单介绍普通javascript以及Jquery的AJAX方法,其中Jquery.ajax()是功能比较强悍的底层方法,可以更多地关注实现过程中的细节:除Jquery.ajax()方法外,Jqu ...
- ant design 中的 Select 组件常规写法
1.代码 import { Select, Spin } from 'antd'; const Option = Select.Option; <Select allowClear showSe ...
- 〖Linux〗使用root权限,telnet登录开发板
1. 在开发板上的/etc/securetty添加 pts/ pts/ pts/ pts/ 2. 设定开发板的root密码 [root@Link /root]# passwd Changing pas ...
- Linux程序调试GDB——数据查看
查看栈信息 当程序被停住了,首先要确认的就是程序是在哪儿被断住的.这个一般是通过查看调用栈信息来看的.在gdb中,查看调用栈的命令是backtrace,可以简写为bt. (gdb) bt #0 ...
- IO多路复用之poll
1.基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制.poll和selec ...
- canvas 压缩图片的大小
使用 signature_pad canvas 库生成的图片太大.但又没有提供方法来压缩. 当然这是根据你canvas的画布大小决定的,某些原因导致我的画布就得是那么大. 随随便便一个图片转化为bas ...