HDU 4135 Co-prime 容斥原理
生活随笔
收集整理的這篇文章主要介紹了
HDU 4135 Co-prime 容斥原理
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接:?http://acm.hdu.edu.cn/showproblem.php?pid=4135
題目描述: 給你A, B, N, 讓你求A到B之間與N互質(zhì)的數(shù)的個數(shù)
解題思路: 容斥原理, 先將N質(zhì)因數(shù)分解, 然后對每一個質(zhì)因子做容斥即可
代碼:?
#include <iostream> #include <cstdio> #include <string> #include <vector> #include <cstring> #include <iterator> #include <cmath> #include <algorithm> #include <stack> #include <deque> #include <map> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 #define mem0(a) memset(a,0,sizeof(a)) #define sca(x) scanf("%d",&x) #define de printf("=======\n") typedef long long ll; using namespace std;ll a, b, n; ll t[100]; ll ans; int cnt;void init( ll num ) {for( ll i = 2; i * i <= num; i++ ) {if( num % i == 0 ) {t[cnt++] = i;while( num % i == 0 ) {num /= i;}}}if( num > 1 ) {t[cnt++] = num;} }ll func( ll m ) {ll ret = 0;for( ll i = 1; i < (1<<cnt); i++ ) {ll val = 1;int temp = 0;for( int j = 0; j < cnt; j++ ) {if( i & (1 << j) ) {val *= t[j];temp++;}}if( temp & 1 ) {ret += m / val;}else {ret -= m / val;}}return m-ret; } int main() {int t;sca(t);int cases = 1;while( t-- ) {scanf( "%lld%lld%lld", &a, &b, &n );ans = 0;cnt = 0;init( n );printf( "Case #%d: %lld\n", cases++, func(b)-func(a-1) );}return 0; } View Code思考: 這次的容斥原理用的是位運算的容斥,每一位表示的是當前這個素因子有沒有用到......今天刪了寫了好長時間寫的代碼......對, 不是故意刪的.....要學習git了......
轉(zhuǎn)載于:https://www.cnblogs.com/FriskyPuppy/p/7444595.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的HDU 4135 Co-prime 容斥原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库 索引
- 下一篇: 基础 - 结构体大小计算