hdu題目鏈結
求第k個與n,m都互素的正數(0 < m, n, k <= 10^9)
使用二分法查詢元素
二分0~(1ll《預處理求素數(素數篩模板 longlong)
求n,m因子:遍歷素數分別求n,m的因子(不包含1,n,m)+使用unique()去重。
ans = sum(x/奇數個因子之積)-sum(x/偶數個因子之積)
例:[1,10]中可以被2,3整除的數有 10/2+10/3-10/6
範圍是long long 凡是與long long 型別進行運算(比較,加減乘除,賦值)的都要設定為long long 變數。(1ll二分法查詢元素:判斷條件/迴圈邊界 的取等
求互素個數遍歷邊界 i*i<=n(小於等於)
尤拉素數篩
long
long prime[maxn]
, tot;
long
long check[maxn]
;void
eular()
}}
求乙個數的因子
for
(long
long i =
0;prime[i]
*prime[i]
<=m; i++)}
if(m >
1) fac[cnt1++
]= m;
用容斥原理求[1,x]中可以被幾個數整除的數的個數(狀態壓縮遍歷各種選擇)
long
longrc(
long
long x)}if
(cnt&
1) ret +
= x/tmp;
else ret -
= x/tmp;
}return ret;
}
#include
using namespace std;
#define maxn 1000005
long
long fac[maxn]
, cnt1;
long
long prime[maxn]
, tot;
long
long check[maxn]
;long
long n, m, k;
void
eular()
}}void
getfac
(long
long n,
long
long m)}if
(n >
1) fac[cnt1++
]= n;
for(
long
long i =
0;prime[i]
*prime[i]
<=m; i++)}
if(m >
1) fac[cnt1++
]= m;
sort
(fac, fac+cnt1)
;int tmp =
unique
(fac, fac+cnt1)
- fac;
cnt1 = tmp;
}//狀態壓縮所有的因子組合,[1,x]中不是互素的數有x/因子*因子,容斥原理排除重複
long
longrc(
long
long x)}if
(cnt&
1) ret +
= x/tmp;
else ret -
= x/tmp;
}return ret;
}long
longds(
)else
}return ans;
}int
main
(int argc,
char
const
*ar**)
return0;
}
HDU3388 Coprime(二分 容斥)
題意 給你n m n,mn,m,讓你找到第k kk個與n nn和m mm互素的數。思路 範圍比較大,我們可以先找出n nn和m mm的質因子,然後二分答案。每次容斥判定mid midmi d是第幾個與n nn和m mm互質的數字。include include include include inc...
hdu3388Coprime 二分 容斥原理
找第k個和n,m互質的數 由容斥原理可得 在 1,x 範圍內且與n不互質的數的個數為 對於所有的n的素數因子 和乙個素數因子不互質的個數 兩個素數因子相乘的個數 三個素數因子相乘的個數 對於x越大,在 1 x 範圍內的與n,m互質的數越多,所以存在單調性,可以用二分找到剛好有k個數和n,m互質 in...
hdu4135 Co prime 互素統計
題意 統計 l,r 中與m互素的數的個數 解法 1.求字首 1,r 中與m互素的個數 2.求反面 不互素的個數,再將m分解質因子,轉化為整除問題 a,m 1,則m至少有乙個質因子整除a。ans a 1 a2 ak ai 為 1,r 中m的第i個質因子的倍數集合 複雜度 o m logm 與區間大小無...