hdu4135容斥原理 組合遍歷

2021-09-07 09:02:13 字數 1039 閱讀 7608

容斥原理實現的關鍵在於:組合遍歷,即如何遍歷2^n種組合。

容斥原理的三種寫法:

#include#include#include#includeusing namespace std;

const int maxn = 32000;

bool isprime[maxn];

int prime[maxn / 4], psize;//線性篩法必須用陣列儲存現有質數

int p[40], ps;

typedef long long ll;

void init()

for (int j = 0; j < psize&&prime[j] * i < maxn; j++)

}}void parse(ll x)

}ll dfs(ll ind, ll n, ll x)

return s;

}ll huzhi(ll n, ll x)

int main()

else

printf("case #%d: %i64d\n", caseid++, ans);

}return 0;

}

佇列陣列法實現容斥原理:

__int64 haha(__int64 m) //用佇列陣列實現容斥原理

for (int i = 1; i < t; i++)

sum = sum + m / que[i];

return sum;

}

佇列陣列實現容斥原理的思想就是:讓下列元素按順序進佇列:

佇列陣列需要開闢乙個佇列來儲存過去的元素,浪費空間。但是它對於每種組合,它沒有從頭開始計算,而是按照一定的順序在過去基礎上計算。借鑑這個思想,位陣列不一定每次都需要從頭計算,可以通過格雷碼來表示位陣列,這樣每次只變化1位,不需要額外空間,兼具佇列陣列和位陣列的優點。

如何獲取變化的那一位呢?記m為第i+1個格雷碼,n為第i個格雷碼,則m^n即為變化的那一位,log2(m^n)即得下標。

接下來就可以在上一步的基礎上進行加入或移除操作。

hdu4135 容斥原理

題意 給出a,b,n,求出 a,b 範圍內與n互素的數字的個數。即b範圍內的不與n互素的數減去a範圍內不與n互素的數,把 1,a 1,b 中不與n互素的數分別求出來,再減掉就是和n互素的數了。那麼首先將n分解質因數,因子和因子的倍數可以被除盡,一定不與n互素,把這些數都記下來,篩法求素數即可 然後把...

hdu 4135 容斥原理

剛接觸,有關因子個數的增加不太弄得好,然後看到了這個神奇的遞迴 ac include includeusing namespace std define ll long long ll a,b,ansa,ansb,ans,p 100 up void dfs int n,bool tag,ll num...

hdu 4135 容斥原理

題意 就是讓你求 a,b 區間於n互質的數的個數.分析 我們可以先轉化下 用 1,b 區間與n互質的數的個數減去 1,a 1 區間與n互質的數的個數,那麼現在就轉化成求 1,m 區間於n互質的數的個數,如果要求的是 1,n 區間與n互質的數的個數的話,我們直接求出n的尤拉函式值即可,可是這裡是行不通...