hdu1695:数论+容斥
题目大意:
求x属于[1,b]和 y属于[1,d]的 gcd(x,y)=k 的方案数
题解:
观察发现 gcd()=k 不好处理,想到将x=x/k,y=y/k 后 gcd(x,y)=1。。
即问题转化为求区间 [1,b/k]和 [1,d/k]的互质数对个数
由于题目规定 (x,y)和(y,x)是同一种,所以我们可以规定 x<y,,然后只需对每一个y求出比他小的即可
公共部分可以通过欧拉函数快速求出。。
非公共部分就不行了。。
所以就分解质因数,用容斥的方法求了
#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
#define maxn 100000
int isnotprime[maxn+];
int num[maxn+];
int fac[maxn+][];
int prime[maxn];
int euler[maxn+];
int np;
int a,b,c,d,k,n,m;
long long ans;
void setprime()
{
np=;
memset(isnotprime,,sizeof(isnotprime));
for(int i=;i<=;i++)
{
if(!isnotprime[i])
prime[np++]=i;
for(int j=;j<np&&prime[j]*i<=;j++)
{
isnotprime[i*prime[j]]=;
if(i%prime[j]==)
break;
}
}
}
void findfac(int x)
{
num[x]=;
int p=x;
for(int i=;i<np;i++)
{
if(p%prime[i]==)
{
fac[x][num[x]++]=prime[i];
}
while(p%prime[i]==)
{
p/=prime[i];
}
}
if(p>)
{
fac[x][num[x]++]=p;
}
}
void setfac()
{
for(int i=;i<=maxn;i++)
{
findfac(i);
}
}
void phi()
{
for(int i=;i<=maxn;i++)
euler[i]=i;
for(int i=;i<=maxn;i+=)
euler[i]/=;
for(int i=;i<=maxn;i++)
{
if(euler[i]==i) //未被筛到。是素数,则用此素数来筛
{
for(int j=i;j<=maxn;j+=i)
{
euler[j]=euler[j]/i*(i-);
}
}
}
return ;
}
void ini()
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
}
int iae(int x)
{
int res=;
int cur,tmp;
for(int i=;i<(<<num[x]);i++)
{
cur=;
tmp=;
for(int j=;j<num[x];j++)
{
if(i&(<<j))
{
cur*=fac[x][j];
tmp++;
}
}
if(tmp&)
{
res+=m/cur;
}
else
{
res-=m/cur;
}
}
return m-res;
}
int cas=;
void solve()
{
printf("Case %d: ",cas++);
if(k==)
{
puts("");
return;
}
m=min(b/k,d/k);
n=max(b/k,d/k);
ans=;
for(int i=;i<=m;i++)
{
ans+=euler[i];
}
for(int i=m+;i<=n;i++)
{
ans+=iae(i);
}
printf("%I64d\n",ans);
}
int main()
{
setprime();
setfac();
phi();
int t;
scanf("%d",&t);
while(t--)
{
ini();
solve();
}
return ;
}
hdu1695:数论+容斥的更多相关文章
- POJ 1150 The Last Non-zero Digit 数论+容斥
POJ 1150 The Last Non-zero Digit 数论+容斥 题目地址: id=1150" rel="nofollow" style="colo ...
- Coprime (单色三角形+莫比乌斯反演(数论容斥))
这道题,先说一下单色三角形吧,推荐一篇noip的论文<国家集训队2003论文集许智磊> 链接:https://wenku.baidu.com/view/e87725c52cc58bd631 ...
- 数论 + 容斥 - HDU 4059 The Boss on Mars
The Boss on Mars Problem's Link Mean: 给定一个整数n,求1~n中所有与n互质的数的四次方的和.(1<=n<=1e8) analyse: 看似简单,倘若 ...
- 数论 + 容斥 - HDU 1695 GCD
problem's Link mean 给定五个数a,b,c,d,k,从1~a中选一个数x,1~b中选一个数y,使得gcd(x,y)=k. 求满足条件的pair(x,y)数. analyse 由于b, ...
- HDU - 2204 Eddy's爱好 (数论+容斥)
题意:求\(1 - N(1\le N \le 1e18)\)中,能表示成\(M^k(M>0,k>1)\)的数的个数 分析:正整数p可以表示成\(p = m^k = m^{r*k'}\)的形 ...
- 【bzoj2393】Cirno的完美算数教室 数论容斥
Description ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~ 现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~ 但是Cirno这么天才的妖精才不屑去数 ...
- CROC 2016 - Elimination Round (Rated Unofficial Edition) F - Cowslip Collections 数论 + 容斥
F - Cowslip Collections http://codeforces.com/blog/entry/43868 这个题解讲的很好... #include<bits/stdc++.h ...
- HDU 5514 Frogs (数论容斥)
题意:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 析:首先可以知道的是第 i 只青蛙可以跳到 k * gcd(ai, m),然后我就计 ...
- UOJ #129 / BZOJ 4197 / 洛谷 P2150 - [NOI2015]寿司晚宴 (状压dp+数论+容斥)
题面传送门 题意: 你有一个集合 \(S={2,3,\dots,n}\) 你要选择两个集合 \(A\) 和 \(B\),满足: \(A \subseteq S\),\(B \subseteq S\), ...
随机推荐
- jQuery扩展与noConflict的用法-小示例
有时我们要用到自己定义的jquery,这时可以通过jQuery扩展来实现该功能 index.html <!DOCTYPE html> <html> <head> & ...
- linux下解压压缩rar文件
http://download.csdn.net/detail/hnust_xiehonghao/6679893 下载地址 1. 下载软件 以rarlinux-3.8.0 for linux为例, ...
- String path = request.getContextPath();这段什么用
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+ ...
- JavaScript兼容问题汇总[实时更新]
印象笔记链接地址:点我查看 遇到问题不断更新中-- [转载请注明出处-HTML5自由者]
- Win2 Socket(套接字)相关 API
Socket(套接字) 作者信息 肖进 单位:南京中萃食品有限公司 资讯部 邮箱:xiaoj@njb.swirebev.com 电话:025-58642091 与socket有关的一些函数介绍 1.读 ...
- C++中的static成员
C++中的static 成员永远是我心中的痛,记了好多次了,但是今天在项目中依然忘记了,今天写下来,方便以后不用再去Baidu.google搜索了. 在头文件中声明静态成员 static int i; ...
- 使用VS Code开发AngularJS 2 第一个应用程序
使用VS Code开发AngularJS 2 第一个应用程序 目录 运行环境 创建项目 安装依赖包 创建TypeScript应用程序 配置应用程序 运行应用程序 运行环境 运行环境: Windows ...
- eclipse 插件 最新 eclipse4.x 插件
Properties Editor: 中文显示属性配置文件 help ——> install new SoftWare ——>add Name: xx Location: http: ...
- uva 10167 - Birthday Cake
题解:由于解太多,随机抓 A.B, 只要有符合就行了: (首先,Ax+By=0必须表示直线,即A.B不能同时为0:另外,要注意到直线不能过输入中的2N个点:检测点在直线的哪一侧,只需要简单的线性规划的 ...
- 关于升级到win10后的网络问题
最近我的alienware电脑从win7升级到win10,看到很多网友都有一个问题,那就是网络受限了, 基本看了很多百度到的,方法基本都不是很有用,我看到了一个网友的办法完美解决了我机器上的网络问题, ...