题目大意:

一、有多少个有序数对(x,y)满足1<=x<=A,1<=y<=B,并且gcd(x,y)为p的一个约数;

二、有多少个有序数对(x,y)满足1<=x<=A,1<=y<=B,并且gcd(x,y)为p的一个倍数。

第一行两个数:p和q。(1<p<10^7 ,1<q<1000。)

接下来有q行,每行两个数A和B。(1<A,B<10^7)

我们先考虑第二个问题 ,很简单答案就是 (A/p) * (B/p) , 因为从p开始每次叠加p枚举到A,B中间得到的数都是可以任意选择,gcd()的值必然是p的倍数的

我们考虑第一个问题,这里约数的个数不超过数字n的2sqrt(n)个

所以我们可以枚举出每一个约数k,然后对k进行求和

对于使用莫比乌斯反演求和的话只是从当前来说复杂度大概是

O(q*lg(p)*(sqrt(A)+sqrt(B))  //sqrt(A)是因为对莫比乌斯数组求前缀和进行快速计算,这是莫比乌斯中常出现的方式

为了较低复杂度,我们列式计算考虑降维

如下列公式所示:

最后是如何计算sum[t],能计算出sum[]数组的话,t最大不超过min(A,B)那么总复杂度就能降为O(q*(sqrt(A)+sqrt(B))就没问题了

这里t只跟k,d有关系,那么只要枚举每一个k,d就能得到sum[t]的数组了

for(int i=0 ; i<cnt ; i++){
for(int d=1 ; d*fac[i]<=M ; d++){
sum[d*fac[i]] += mu[d];
}
}
for(int i=1 ; i<=M ; i++) sum[i] += sum[i-1];
 #include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath> using namespace std;
#define ll long long
#define N 10005
#define M 10000000
int p,q,a,b,cnt;
int fac[N];
int mu[M+] , prime[M/] , tot , sum[M];
bool check[M+]; void get_mu()
{
mu[] = ;
for(int i= ; i<=M ; i++){
if(!check[i]){
mu[i] = -;
prime[tot++] = i;
}
for(int j= ; j<tot ; j++){
if((ll)prime[j]*i>M) break;
check[prime[j]*i] = true;
if(i%prime[j]==) break;
else mu[i*prime[j]] = -mu[i];
}
}
} void init()
{
int v = (int)sqrt(p+0.5);
for(int i= ; i<=v ; i++){
if(p%i==){
fac[cnt++] = i;
if(p/i!=i) fac[cnt++] = p/i;
}
}
} void pre_solve()
{
for(int i= ; i<cnt ; i++){
for(int d= ; d*fac[i]<=M ; d++){
sum[d*fac[i]] += mu[d];
}
}
for(int i= ; i<=M ; i++) sum[i] += sum[i-];
} ll cal(int a , int b)
{
ll ans = ;
for(int t= , last ; t<=a ; t=last+){
last = min(a/(a/t) , b/(b/t));
ans += (ll)(sum[last]-sum[t-])*(a/t)*(b/t);
}
return ans;
} int main()
{
get_mu();
scanf("%d%d" , &p , &q);
init();
pre_solve();
while(q--){
scanf("%d%d" , &a , &b);
if(a>b) swap(a , b);
printf("%lld %lld\n" , cal(a,b) , (ll)(a/p)*(b/p));
}
}
 

CSU 1325 莫比乌斯反演的更多相关文章

  1. CSU 1325: A very hard problem 中南月赛的一道题。

    1325: A very hard problem Time Limit: 3 Sec  Memory Limit: 160 MBSubmit: 203  Solved: 53[Submit][Sta ...

  2. hdu1695 GCD(莫比乌斯反演)

    题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...

  3. BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][ ...

  4. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  5. Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)

    题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...

  6. 莫比乌斯函数筛法 & 莫比乌斯反演

    模板: int p[MAXN],pcnt=0,mu[MAXN]; bool notp[MAXN]; void shai(int n){ mu[1]=1; for(int i=2;i<=n;++i ...

  7. 【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2371  Solved: 1143[Submit][Sta ...

  8. POI2007_zap 莫比乌斯反演

    题意:http://hzwer.com/4205.html 同hdu1695 #include <iostream> #include <cstring> #include & ...

  9. hdu.5212.Code(莫比乌斯反演 && 埃氏筛)

    Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

随机推荐

  1. ReportDB数据库存储选型分析

    SQLServer关于reportDB的存储选型做如下分析: 网络存储两大主要类型: 1.NAS 支持的文件传输协议:NFS(unix/linux文件共享).SMB(windows).samba(li ...

  2. android界面横屏和竖屏的切换

    关于android横屏和竖屏的切换网上给了很多种.但是有些介绍的方法都是在android旧版本上. 我现在把握用到的情况写下来用于备忘: android 版本:4.0 - 4.4 要求:android ...

  3. response.setContentType设置

    response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据.例如web浏览器就是通过MIM ...

  4. linux下解压war格式的包

    linux解压 .war 包 war格式的包可以解决web应用程序部署时候不用按照目录层次结构部署,而是将war包当作部署单元来使用. 下面就讲下怎么去解压 .war 格式的压缩包: 1.安装jdk, ...

  5. [问题2014A02] 解答二(求和法+拆分法,由张诚纯同学提供)

    [问题2014A02] 解答二(求和法+拆分法,由张诚纯同学提供) 将行列式 \(|A|\) 的第二列,\(\cdots\),第 \(n\) 列全部加到第一列,可得 \[ |A|=\begin{vma ...

  6. javascript 字符转换为ascii码,ascii码转换为字符

    <script> str="A"; code = str.charCodeAt(); str2 = String.fromCharCode(code); str3 = ...

  7. SVN错误及处理

    SVN无法读取current修复方法 Can't read file : End of file found 文件:repository/db/txn_current.repository/db/cu ...

  8. 制作登录界面,登录成功后把用户名放在session里,在第3个页面读取session显示用户名

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  9. 阻抗计算公式、polar si9000(教程)

    给初学者的一直有很多人问我阻抗怎么计算的. 人家问多了,我想给大家整理个材料,于己于人都是个方便.如果大家还有什么问题或者文档有什么错误,欢迎讨论与指教!在计算阻抗之前,我想很有必要理解这儿阻抗的意义 ...

  10. psd切图

    打开UI设计师给你的PSD文件,我们以下图为例,截产品超市前面的购物车 1.按v选择移动工具,然后在上面的选项栏中勾选自动选择,在再右边选择图层 2.这时候用鼠标选中产品超市前面的购物车,就能在右边的 ...