/**
题目:BZOJ2820 YY的GCD
链接:http://www.cogs.pro/cogs/problem/problem.php?pid=2165
题意:神犇YY虐完数论后给傻×kAc出了一题
给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对
kAc这种傻×必然不会了,于是向你来请教……
T = 10000
N, M <= 10000000
思路:
f(n)表示gcd==n的对数。
g(n)表示gcd的n的倍数的对数。
u(d/p) = mu[d/p]; ans = sigma[p是质数,p<=min(n,m)]sigma[p|d] (u(d/p)*g(d)) = sigma[p是质数,p<=min(n,m)]sigma[p|d] (u(d/p)*(n/d)*(m/d)) = sigma[1<=d<=min(n,m)](n/d)*(m/d)sigma[p是d的约数且p是素数](u(d/p)); 参考:http://www.cnblogs.com/candy99/p/6209609.html */
#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 = 1e7 + ;
int prime[maxn], tot, not_prime[maxn];
int mu[maxn], sum[maxn];
inline int read()
{
char c = getchar();
int x = ;
while(c<''||c>''){
c = getchar();
}
while(c>=''&&c<='') x = x*+c-,c = getchar();
return x;
}
//法2.
//线性筛
//g[i*p[j]]
//当p[j]|i时结果显然为miu(i)
//否则考虑mu(i*p[j]/pp),当p[j]=pp时为mu[i],p[j]!=pp时的所有的和就是-g(i),所以总的结果为mu(i)-g(i)
/*
void mobius()
{
mu[1] = 1;
tot = 0;
for(int i = 2; i < maxn; i++){
if(!not_prime[i]){
mu[i] = -1;
prime[++tot] = i;
sum[i] = 1;
}
for(int j = 1; prime[j]*i<maxn; j++){
not_prime[prime[j]*i] = 1;
if(i%prime[j]==0){
mu[prime[j]*i] = 0;
sum[prime[j]*i] = mu[i];
break;
}
mu[prime[j]*i] = -mu[i];
sum[prime[j]*i] = mu[i]-sum[i];
}
} for(int i = 1; i < maxn; i++) sum[i] += sum[i-1];
}*/
//法1.
//只需要枚举每个素数,将他的倍数的g更新就可以了
//由于有1/1+1/2+1/3+...+1/n=O(logn)这个结论
//因此每个质数枚举时是均摊O(logn)的(*n后好想,是nlogn,但是质数只有n/logn个)
//而质数恰好有O(n/logn)个 因此暴力枚举就是O(n)的
void mobius()
{
mu[] = ;
tot = ;
for(int i = ; i < maxn; i++){
if(!not_prime[i]){
mu[i] = -;
prime[++tot] = i;
}
for(int j = ; prime[j]*i<maxn; j++){
not_prime[prime[j]*i] = ;
if(i%prime[j]==){
mu[prime[j]*i] = ;
break;
}
mu[prime[j]*i] = -mu[i];
}
} for(int i = ; i <= tot; i++){
for(int j = prime[i]; j < maxn; j+=prime[i]){
sum[j] += mu[j/prime[i]];
}
} for(int i = ; i < maxn; i++) sum[i] += sum[i-]; }
LL solve(int n,int m)
{
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]-sum[i-])*(n/i)*(m/i);
}
return ans;
} int main()
{
freopen("YYnoGCD.in","r",stdin);
freopen("YYnoGCD.out","w",stdout);
int n, m;
int T;
T = read();
mobius();
while(T--)
{
n = read();
m = read();
printf("%lld\n",solve(n,m));
}
return ;
}

BZOJ2820 YY的GCD 莫比乌斯+系数前缀和的更多相关文章

  1. BZOJ2820:YY的GCD(莫比乌斯反演)

    Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必 ...

  2. BZOJ2820 YY的GCD 【莫比乌斯反演】

    BZOJ2820 YY的GCD Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, ...

  3. [BZOJ2820]YY的GCD

    [BZOJ2820]YY的GCD 试题描述 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少 ...

  4. bzoj 2820 YY的GCD 莫比乌斯反演

    题目大意: 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 这里就抄一下别人的推断过程了 后面这个g(x) 算的方法就是在线性 ...

  5. [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)

    [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...

  6. 【BZOJ2820】YY的GCD [莫比乌斯反演]

    YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 求1<=x<=N, ...

  7. [Luogu P2257] YY的GCD (莫比乌斯函数)

    题面 传送门:洛咕 Solution 推到自闭,我好菜啊 显然,这题让我们求: \(\large \sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)\in prime]\) 根 ...

  8. BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】

    2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1624  Solved: 853[Submit][Status][Discu ...

  9. Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)

    2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MB Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x& ...

随机推荐

  1. 关于Java的File类、字节流和字符流

    一.File类: 在Windows下的路径分隔符(\)和在Linux下的路径分隔符(/)是不一样的,当直接使用绝对路径时,跨平台会报No Such file or diretory异常. File中还 ...

  2. Perforce查看workspace sync到的changlist

    一 查看workspace sync到的changelist perforce的workspace其实是一些特定版本的文件的 结合,相比只将workspace对应到某个特定的changelist,此方 ...

  3. IDEA java开发 Restful 风格的WebService

    官网:https://www.jetbrains.com/help/idea/restful-webservices.html 1.在IntelliJ中创建新项目,选择Java Enterprise ...

  4. 快速实现一个生产者-消费者模型demo

    package jesse.test1; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Blo ...

  5. iptables不小心把127.0.0.1封了,导致redis连不上

    写了个脚本扫描apache日志,自动把恶意攻击者的ip交给iptables给封掉 谁知道一不小心把127.0.0.1也给封了... 直接导致redis无法链接. redis-server服务正常启动, ...

  6. minic 词法单元建立

    #include <stdio.h> #include "symbol_table_def.h" //前面的那个词法和文法说明只是大概的说明,现在又有了改动,把指针运算 ...

  7. servlet中ServletConfig的使用

    转自:http://www.zzzj.com/html/20090117/69483.html 前言 相对于ServletContext,ServletConfig是针对特定的Servlet的参数或属 ...

  8. PHPMailer_v5.1 使用[转]

    <?php /* * email 报警,主要检查服务器数据库是否还能正常连接 */ require("../common/config.php"); include(&quo ...

  9. Chrome扩展之css used 获取网页样式

    地址栏输入: chrome://extensions/ 然后获取更多扩展程序,得到css used 复制html节点 最后点击 "css used" 把样式全部复制下来即可 (记住 ...

  10. 算法笔记_058:蓝桥杯练习 2的次幂表示(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001. 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面 ...