HYSBZ 2301


 1 /***
2 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数
3 **/
4 #include <iostream>
5 #include <cstdio>
6 #include <algorithm>
7
8 using namespace std;
9 const int maxn = 50010;
10 int isprime[maxn],prime[maxn],mu[maxn],sum[maxn];
11
12 int t,a,b,c,d,k;
13 int cnt;
14 void mobius(int n){
15 int i,j;
16 cnt =0;
17 mu[1] =1;
18 for(i=2;i<=n;i++){
19 if(!isprime[i]){
20 prime[cnt++] = i;
21 mu[i] = -1;
22 }
23 for(j=0;j<cnt&&i*prime[j]<=n;j++){
24 isprime[i*prime[j]] = 1;
25 if(i%prime[j])
26 mu[i*prime[j] ] = -mu[i];
27 else{
28 mu[i*prime[j]] = 0;
29 break;
30 }
31 }
32 }
33 }
34
35 long long solve(int n,int m){
36 int i,la;
37 long long ret =0;
38 if(n>m)
39 swap(n,m);
40 for(i=1,la=0;i<=n;i=la+1){
41 la = min(n/(n/i),m/(m/i));
42 ret += (long long )(sum[la]-sum[i-1])*(n/i)*(m/i);
43 }
44 return ret;
45 }
46
47 int main(){
48 int i,j;
49 mobius(50000);
50 for(i=1;i<50000;i++)
51 sum[i] = sum[i-1]+mu[i];
52 scanf("%d",&t);
53 while(t--){
54 scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
55 long long ans;
56 ans = solve(b/k,d/k)-solve((a-1)/k,d/k)
57 -solve((c-1)/k,b/k)+solve((a-1)/k,(c-1)/k);
58 printf("%lld\n",ans);
59 }
60 return 0;
61 }

HYSBZ 2301

时间: 2024-10-14 08:05:06

HYSBZ 2301的相关文章

HYSBZ - 2301 莫比乌斯反演

链接 题解:直接用公式算,用容斥来减掉重复计算的部分 但是我犯了一个非常sb的错误,直接把abcd除k了,这样算a-1的时候就错了,然后举的例子刚好还没问题= = ,结果wa了好几发 //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast,no-stack-protector") //#pragma GCC target("sse,sse2,sse3,ssse3

csu 2014 summer training day 2 莫比乌斯反演

SPOJ VLATTICE 题意:x,y,z<=1000000,x<=a,y<=b,z<=c,给定a.b.c,求gcd(x,y,z)=1的个数 解释:设 f(n)是gcd(x,y,z)=n的种数,F(n)=n|gcd(x,y,z)的种数 那么F(n)=f(n)+f(2n)....=sigm(f(d)){n|d} 那么根据反演公式 f(n)=sigm(u(d/n)*F(d)){n|d} 我们要求的是f(1)=sigm(u(1)*F(n)+u(2)*F(2n)+u(3)*F(3n)..

Xor HYSBZ - 2115 (线性基)

Xor HYSBZ - 2115 题意:给一个树,求1到n的最长路径.这里的路径定义为异或和. 线性基~~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 struct LiBase{ 5 ll a[63]; 6 //初始化 7 void init(){ 8 memset(a,0,sizeof(a)); 9 } 10 //插入 11 bool insert_(ll x){ 12 for(int

bzoj 2301 Problem b - 莫比乌斯反演

Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数n,接下来n行每行五个整数,分别表示a.b.c.d.k Output 共n行,每行一个整数表示满足要求的数对(x,y)的个数 Sample Input 22 5 1 5 11 5 1 5 2 Sample Output 143 HINT 100%的数据满足:1≤n≤50000,1≤a≤b≤50000

HYSBZ - 1799 self 同类分布

self 同类分布 HYSBZ - 1799 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.Sample Input 10 19 Sample Output 3 Hint [约束条件]1 ≤ a ≤ b ≤ 10^18 约束:一个数是它自己数位和的倍数,直接dp根本找不到状态,枚举数位和,因为总就162,然后问题就变成了一个数%mod=0,mod是枚举的,想想状态:dp[pos][sum][val],当前pos位上数位和是sum,val就是在算这个数%mod,(从高位算  *10

bzoj 2301 莫比乌斯反演

求$(i,j)=k$的一系列模板题之一. 但是这里i,j是有下界的,注意用容斥去掉重复组,其他都一样了. /** @Date : 2017-09-09 19:21:18 * @FileName: bzoj 2301 莫比乌斯反演 多组 范围内 GCD=k.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : $Id$ */ #inclu

BZOJ 2301 Problem b

AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 冬令营听了莫比乌斯,这就是宋老师上课讲的例题咯[今天来实现一下] 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 5 using namespace std; 6 7 inline int in(){ 8 int x=0;char ch=getchar(); 9 while(ch

【BZOJ】【2301】problem b

莫比乌斯反演/容斥原理 Orz PoPoQQQ PoPoQQQ莫比乌斯函数讲义第一题. for(i=1;i<=n;i=last+1){ last=min(n/(n/i),m/(m/i)); …… } 这种写法可以O(sqrt(n))枚举所有的n/d!!!这个枚举除法的取值在莫比乌斯反演中非常常用!!! 1 /************************************************************** 2 Problem: 2301 3 User: Tunix 4

HYSBZ 1036 树的统计Count(树链剖分)

HYSBZ 1036 树的统计Count 题目链接 就树链剖分,线段树维护sum和maxx即可 代码: #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int N = 30005; int dep[N], fa[N], son[N], sz[N], top[N], id[N], idx, val[N];