hdu1695(莫比乌斯)或欧拉函数+容斥
题意:求1-b和1-d之内各选一个数组成数对。问最大公约数为k的数对有多少个,数对是有序的。(b,d,k<=100000)
解法1: 这个能够简化成1-b/k 和1-d/k 的互质有序数对的个数。
如果b=b/k。d=d/k,b<=d.欧拉函数能够算出1-b与1-b之内的互质对数。然后在b+1到d的数i,求每一个i在1-b之间有多少互质的数。
解法是容斥,getans函数參数的意义:1-tool中含有rem位置之后的i的质因子的数的个数。
在
for(int j=rem;j<=factor[i][0];j++)
ans+=tool/factor[i][j]-getnum(i,tool/factor[i][j],j+1);
这个循环中。ans加的等号后每项表示当前最大的质因子是factor[i][j]的数量,目的是去重。
解法2:莫比乌斯,莫比乌斯数组确实非常实用。事实上也非常easy,mou的位置的含义是,首先假设i有个质因子出现2次或以上。则mou值为0,否则1与-1跟i的质因子奇偶性决定。目的也是容斥。
解法1代码:
/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std; #define eps 1e-8
#define zero(_) (abs(_)<=eps)
const double pi=acos(-1.0);
typedef long long LL;
const int Max=100010;
const LL INF=0x3FFFFFFF;
int a, b, c, d, k;
int factor[Max][20];
bool rem[Max];
LL oular[Max];
void init()
{
for(int i=1; i<Max; i++)
oular[i]=i;
for(LL i=2; i<Max; i++)
{
if(!rem[i])
{
factor[i][++factor[i][0]]=i;
oular[i]=i-1;
for(LL j=i*2; j<Max; j+=i)
{
factor[j][++factor[j][0]]=i;
rem[j]=1;
oular[j]=oular[j]*(i-1)/i;
}
}
}
for(int i=1; i<Max; i++)
oular[i]=oular[i]+oular[i-1];
}
LL getnum(int i,int tool,int rem)
{
int ans=0;
for(int j=rem;j<=factor[i][0];j++)
ans+=tool/factor[i][j]-getnum(i,tool/factor[i][j],j+1);
return ans;
}
int main()
{
int t;
cin>>t;
init();int kk=1;
while(t--)
{
cin>>a>>b>>c>>d>>k;
printf("Case %d: ",kk++);
if(k==0)
{
cout<<"0\n";
continue;
}
b/=k;
d/=k;
if(b>d)swap(b,d);
LL ans=oular[b];
for(int i=b+1;i<=d;i++)
{
ans+=b-getnum(i,b,1);
}
cout<<ans<<endl;
}
return 0;
}
解法2代码:
/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std; #define eps 1e-8
#define zero(_) (abs(_)<=eps)
const double pi=acos(-1.0);
typedef long long LL;
const int Max=100010;
const LL INF=0x3FFFFFFF;
int a, b, c, d, k;
bool rem[Max];
int mou[Max];
void init()
{
mou[1]=1;
for(LL i=2; i<Max; i++)
{
if(!rem[i])
{
mou[i]=i;
for(LL j=i*2; j<Max; j+=i)
{
rem[j]=1;
mou[j]=i;
}
}
}
for(int i=2; i<Max; i++)
{
if(i/mou[i]%mou[i]==0) mou[i]=0;
else mou[i]=-mou[i/mou[i]];
}
}
int main()
{
int t;
cin>>t;
init();
int kk=1;
while(t--)
{
cin>>a>>b>>c>>d>>k;
printf("Case %d: ",kk++);
if(k==0)
{
cout<<"0\n";
continue;
}
b/=k;
d/=k;
if(b > d)swap(b,d);
long long ans1 = 0;
for(int i = 1; i <= b; i++)
ans1 += (long long)mou[i]*(b/i)*(d/i);
long long ans2 = 0;
for(int i = 1; i <= b; i++)
ans2 += (long long)mou[i]*(b/i)*(b/i);
ans1 -= ans2/2;
cout<<ans1<<endl;
}
return 0;
}
hdu1695(莫比乌斯)或欧拉函数+容斥的更多相关文章
- HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 6390 欧拉函数+容斥(莫比乌斯函数) GuGuFishtion
http://acm.hdu.edu.cn/showproblem.php?pid=6390 题意:求一个式子 题解:看题解,写代码 第一行就看不出来,后面的sigma公式也不会化简.mobius也不 ...
- hdu 1695 GCD(欧拉函数+容斥)
Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD( ...
- HDU 1695 GCD 欧拉函数+容斥定理
输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...
- HDU1695-GCD(数论-欧拉函数-容斥)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- $BZOJ$2818 $gcd$ 莫比乌斯反演/欧拉函数
正解:莫比乌斯反演/欧拉函数 解题报告: 传送门$QwQ$ 一步非常显然的变形,原式=$\sum_{d=1,d\in prim}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}[gcd ...
- BZOJ2005:[NOI2010]能量采集(莫比乌斯反演,欧拉函数)
Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得 ...
- Bzoj 2818: Gcd 莫比乌斯,分块,欧拉函数,线性筛
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3241 Solved: 1437[Submit][Status][Discuss ...
- luogu2658 GCD(莫比乌斯反演/欧拉函数)
link 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 1<=N<=10^7 (1)莫比乌斯反演法 发现就是YY的GCD,左转YY的GCD ...
随机推荐
- jQuery中的index方法介绍
从jq api手册摘过来的内容,index这个方法在写 tab silder 之类的组件还是比较有用的说. js没有传统的函数重载的概念,但是根据传入参数的不同,js的函数可以完成不同的功能,也可说是 ...
- 17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 获取复制Master Binary Log的坐标:
17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 获取复制Master Binary Log的坐标: 你需要master ...
- quant_百度百科
quant_百度百科 quant 编辑 quant的工作就是设计并实现金融的数学模型(主要采用计算机编程),包括衍生物定价,风险估价或预测市场行为等.所以quant更多可看为工程师 ...
- UML九种图 之 包图和对象图
前言 对象图和包图依然是对系统的静态的描写叙述.UML九种图加上包图,事实上是十幅图. 包图 1.构成 2.包中的元素 类.接口.用例.构件.其他包等.( ...
- Excel自己定义纸张打印设置碰到无法对上尺寸的问题
作者:iamlaosong 据操作人员反映.自己定义纸张设置无论用,打印时每页表头都会下移,非常快就跑偏到下涨纸了. 打印机是针打,齿轮进纸.应该非常精确的.初步怀疑纸张尺寸量的有问题,建议其多量几页 ...
- 从汇编角度来理解linux下多层函数调用堆栈执行状态
注:在linux下开发经常使用的辅助小工具: readelf .hexdump.od.objdump.nm.telnet.nc 等,详细能够man一下. 我们用以下的C代码来研究函数调用的过程. C ...
- [置顶] Guava学习之Iterators
Iterators类提供了返回Iterator类型的对象或者对Iterator类型对象操作的方法.除了特别的说明,Iterators类中所有的方法都在Iterables类中有相应的基于Iterable ...
- 基于JSP+SERVLET的新闻发布系统(一)
本系统使用的是基于JSP+SERVLET+TOMCAT6 数据库使用的是MYSQL IDE是MYECLIPSE8.5,页面编辑使用的是百度的ueditor,比较适合咱国人 采用MVC模式,使用的关键技 ...
- 减少可执行程序size的三个常用软件
减少可执行程序size的三个常用软件 linux下面,直接用strip 这个命令 #:strip xxx 可以去掉编译调试信息和各种符号表,能够大大减小可执行程序size windows下面这种exe ...
- 基于visual Studio2013解决面试题之1401冒泡排序
题目