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:莫比烏斯,莫比烏斯數組確實很有用。其實也很簡單,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