题意:求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:莫比乌斯,莫比乌斯数组确实很有用。其实也很简单,mou的位置的含义是,首先如果i有个质因子出现2次或以上,则mou值为0,否则1与-1跟i的质因子奇偶性决定。目的也是容斥。
解法1代码:
/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include
#include
#include
#include
#include
#include
#include
#include
#include