容斥原理+質因數分解+組合數學
poj 3904---容斥原理
hdu 1695---容斥原理
poj 1091---容斥原理
poj 2773---二分+容斥原理
poj 3904---容斥原理
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define ll long long #define N 10010 int p[N],g[N]; int t[20]; ll h[N]; void solve(int x) { int i,j,k,cnt=0; for(i=2;i*i<=x;i++) { if(x%i==0) { t[cnt++]=i; while(x%i==0) x/=i; } } if(x!=1) t[cnt++]=x; int tt=(1<<cnt); for(i=1;i<tt;i++) { int tsum=1,tflag=0; for(j=0;j<cnt;j++) { if((i>>j)&1) { tsum*=t[j]; tflag++; } } p[tsum]++; g[tsum]=tflag; } } int main() { int n; ll i,j,k; h[0]=h[1]=h[2]=h[3]=0; for(i=4;i<=10000;i++) { h[i]=i*(i-1)*(i-2)*(i-3)/24; } while(scanf("%d",&n)!=EOF) { memset(p,0,sizeof(p)); memset(g,0,sizeof(g)); for(i=0;i<n;i++) { scanf("%d",&k); solve(k); } ll res=h[n]; for(i=1;i<=10000;i++) { if(p[i]!=0) { if(g[i]&1) res-=h[p[i]]; else res+=h[p[i]]; } } cout<<res<<endl; } }
hdu 1695---容斥原理
#include<cstdio> #include<cstring> #include<string.h> #include<stdio.h> #include<algorithm> #include<iostream> #include<cstdlib> #include<vector> #include<set> #include<cmath> #include<math.h> using namespace std; #define inf 0x3f3f3f3f #define ll __int64 #define N 100010 int prime[N+10]; ll phi[N+10]; ll sum[N+10]; void dabiao() { int i,j,k; memset(prime,0,sizeof(prime)); for(i=2;i*i<N;i++) if(!prime[i]) for(j=i*i;j<N;j+=i) prime[j]=1; for(i=1;i<N;i++) phi[i]=i; for(i=2;i<N;i++) if(!prime[i]) for(j=i;j<N;j+=i) phi[j]=phi[j]/i*(i-1); sum[1]=1; //sum[2]=phi[2]; for(i=2;i<N;i++) sum[i]=sum[i-1]+phi[i]; } int h[30]; int main() { int i,j,k,t; scanf("%d",&t); int he=0; dabiao(); while(t--) { he++; int a,c,b,d; scanf("%d%d%d%d%d",&a,&b,&c,&d,&k); if(k==0) { printf("Case %d: 0\n",he); continue; } if(b>d) swap(b,d); b/=k,d/=k; ll res=sum[b]; for(i=b+1;i<=d;i++) { res+=b; int cnt=0; int te=i; for(j=2;j*j<=te;j++) { if(te%j==0) { h[cnt++]=j; while(te%j==0) te/=j; } } if(te!=1) h[cnt++]=te; int tt=(1<<cnt); for(j=1;j<tt;j++) { int tsum=1,tflag=0; for(k=0;k<cnt;k++) { if((j>>k)&1) { tsum*=h[k]; tflag++; } } if(tflag&1) res-=b/tsum; else res+=b/tsum; } } printf("Case %d: %I64d\n",he,res); } }
poj 1091---容斥原理
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define ll long long #define N 10010 int t[20]; int n; ll m; ll qpow(ll x) { ll sum=1; for(int i=0;i<n;i++) sum*=x; return sum; } void solve(ll x) { int i,j,k,cnt=0; for(i=2;i*i<=x;i++) { if(x%i==0) { t[cnt++]=i; while(x%i==0) x/=i; } } if(x!=1) t[cnt++]=x; int tt=(1<<cnt); ll res=qpow(m); for(i=1;i<tt;i++) { int tsum=1,tflag=0; for(j=0;j<cnt;j++) { if((i>>j)&1) { tsum*=t[j]; tflag++; } } if(tflag&1) res-=qpow(m/tsum); else res+=qpow(m/tsum); } cout<<res<<endl; } int main() { int i,j,k; scanf("%d%lld",&n,&m); solve(m); //system("pause"); }
poj 2773---二分+容斥原理
<pre name="code" class="cpp">#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 10010
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
ll h[20];
ll p[20000];
ll f[20000];
ll tcnt;
ll solve(ll x)
{
ll res=x;
for(ll i=0;i<tcnt;i++)
{
if(f[i]&1)
res-=x/p[i];
else
res+=x/p[i];
}
return res;
}
int main()
{
ll i,j,k,m;
while(scanf("%lld%lld",&m,&k)!=EOF)
{
ll l=0,r=1000000000000,mid,ans,flag;
ll cnt=0,t=m;
for(i=2;i*i<=t;i++)
{
if(t%i==0)
{
h[cnt++]=i;
while(t%i==0)
t/=i;
}
}
if(t!=1)
h[cnt++]=t;
ll tt=(1<<cnt);
tcnt=0;
for(i=1;i<tt;i++)
{
ll tsum=1,tflag=0;
for(j=0;j<cnt;j++)
{
if((i>>j)&1)
{
tsum*=h[j];
tflag++;
}
}
p[tcnt]=tsum;
f[tcnt++]=tflag;
}
while(l<r)
{
mid=(l+r)/2;
ans=solve(mid);
if(ans>=k)
r=mid;
else
l=mid+1;
}
printf("%lld\n",r);
}
}
相關推薦
容斥原理+質因數分解+組合數學
poj 3904---容斥原理 hdu 1695---容斥原理 poj 1091---容斥原理 poj 2773---二分+容斥原理 poj 3904---容斥原理 #include<iostream> #include<stdio.h> #
HDU 4407 Sum(容斥原理+質因數分解)
題意: 給一個長度為n的序列,序列由1~n依次組成。 對序列執行兩種操作: 1.查詢[x,y]內與p互素的數的和; 2.修改第x數為c. 思路: 往線段樹的方向想了半天,發現就是容斥原理略微變形,腦殘不可醫啊。。 修改操作可以用map進
【HDU 4135 Co-prime】容斥定理+質因數分解
HDU4135 題意 求A-B之間與N互質的數的個數 做法 我們首先對N分解質因數,再對其所有因子進行容斥,最後能得到所有與N不互質的數的個數,最後用n減去這個個數,就是與n互質的數的個數。 #include<stdio.h> #include<
bzoj 4517: [Sdoi2016]排列計數【容斥原理+組合數學】
沒有 原理 getchar() display del d+ getchar esp const 第一個一眼就A的容斥題! 這個顯然是容斥的經典問題------錯排,首先考慮沒有固定的情況,設\( D_n \)為\( n \)個數字的錯排方案數。 \[ D_n=n!-\su
Codeforces 451 E. Devu and Flowers(組合數學,數論,容斥原理)
傳送門 解題思路: 假如只有 s 束花束並且不考慮 f ,那麼根據隔板法的可重複的情況時,這裡的答案就是 假如說只有一個 f 受到限制,其不合法時一定是取了超過 f 的花束 那麼根據組合數,我們仍然可以算出其不合法的解共有: 最後,由於根據容斥,減兩遍的東西要加回來,那麼含有偶數個 f 的項
【組合數學 容斥原理】ICPC2014西安 F. Color
https://vjudge.net/contest/265252#problem/F 給你n朵花,m種顏色,k (1 ≤ n, m ≤ 10^9 , 1 ≤ k ≤ 10^6 , k ≤ n, m) 花是一排,要求相鄰花染色不能相同,染色數量剛好等於k,問你染色的方案數 如
BZOJ4710 JSOI2011分特產(容斥原理+組合數學)
顯然可以容斥去掉每人都不為空的限制。每種物品分配方式獨立,各自算一個可重組合乘起來即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include&
BZOJ4767 兩雙手(組合數學+容斥原理)
因為保證了兩向量不共線,平面內任何一個向量都被這兩個向量唯一表示。問題變為一張有障礙點的網格圖由左上走到右下的方案數。 到達終點所需步數顯然是平方級別的,沒法直接遞推。注意到障礙點數量很少,那麼考慮容斥,即用總方案數減去經過障礙點的方案數。對每個障礙點計算其作為第一個經過的障礙點的方案數即可。
組合數學 容斥原理 學習筆記 (福利向)和Leo一起做愛數學的好孩子(未完待續
演算法競賽考得很多的部分啊 這個還是很重要的 在目前的演算法競賽中有三大計數考點 1)組合計數 2)線性計數 3)群論計數 其中群論計數比較困難,我又不知道什麼是線性計數,所以只能頹組合計數。 首先是最簡單的東西 加法原理 若完成一件事的方法有nnn類,其中第i
BZOJ4559 JLOI2016成績比較(容斥原理+組合數學+斯特林數)
容斥一發改為計算至少碾壓k人的情況數量,這樣對於每門課就可以分開考慮再相乘了。剩下的問題是給出某人的排名和分數的值域,求方案數。枚舉出現了幾種不同的分數,再列舉被給出的人的分數排第幾,算一個類似斯特林數的東西即可。後一部分與碾壓幾人是無關的,預處理一下,複雜度即為三方。當然和四方跑得也差不多快。 資
[BZOJ4710][Jsoi2011]分特產(容斥原理+組合數學)
題目描述 傳送門 題解 這道題的限制其實挺不明顯的,應該是“每個人都至少有一個” 也就是說對於所有的物品,將其劃分成n部分,每部分不能為空,問總的方案數 可以如果利用插板法的話,把n個相同的小
組合數學:容斥原理及其應用
容斥原理 例題:從1到1000中不能被5,6,8整除的整數個數。 令P1具有被5整除的性質,P2具有被6整除的性質,P3被8整除性質。 S是前1000個正整數的集合希望求出三個性質同時不滿足的個數 |A1| = floor(1000/5) = 200;|A2| =
luoguP4491&&bzoj5306[HAOI2018]染色 NTT 容斥原理 組合數學
[HAOI2018]染色 題目傳送門 luogu bzoj 分析 一個神奇的容斥。 題目中的恰好提示我們要把它轉化成至少 設 f [
錯排問題 組合數學+容斥原理
3.錯排問題(problem) 【題目描述】 n本不同的書放在書架上。其中m本書已經重新擺放好,將剩下的n-m 本書也重新擺放,使每本書都不在原來放的位置。 求有幾種擺法。 【輸入資料】 第1行兩個數
acm組合數學及其應用--容斥原理與鴿巢原理(一)
acm組合數學及其應用–容斥原理與鴿巢原理 追逐青春的夢想,懷著自信的心,永不放棄 1、容斥原理 定理一(德摩根定理) 若A和B是全集U的子集, 1、則A和B並集的補集等於A的補集與B的補集的交集 2、則A和B交集的補集等於A的補集
組合數學——容斥原理和錯位排列
真的,學了組合數學你會克服公式恐懼症0.0深有體會…… 容斥原理 設A1,A2,…,An為有限集合,用|Ai|表示集合Ai中的元素個數那麼有這樣的結論: |A1∪A2∪…∪An|=∑i=1n|Ai|−∑1≤i<j≤n|Ai∩Aj|+∑1≤i<
組合數學-容斥原理
題意:求gcd(x,y)==k個數,其中x屬於[1,b],y屬於[1,d],其中x=5,y=7與x=7,y=5,是一樣的。 思路:求x在[1,b],y在[1,d],gcd(x,y)=k的個數 就是求x在[1,b/k],y在[1,d/k],gcd(x,
bzoj 4710(組合數學+容斥原理)
傳送門 題解: 先介紹一條公式:將n個物品分給m個人有C(n+m-1,m-1)種方案。但是這些方案是包括了不合法的(有些人沒有獲得任何物品)。對於這道題,需要保證所有人都分到物品,所以容斥原理解決:
UVALive 7040 Color (容斥原理 + 組合數學遞推公式 + 求逆元 + 基礎數論)
傳送門 英文題目: Recently, Mr. Big recieved n owers from his fans. He wants to recolor those owers with m colors. The owers are put in
UVa 11481 Arrange the Numbers (組合數學+容斥原理)
UVa 11481 Arrange the Numbers 題目大意: 可以將序列1,2,3,...n任意重排,但重排後的前m(m≤n)個位置恰好有k(k≤m)個不變,求方案數除以1000000