1. 程式人生 > >容斥原理+質因數分解+組合數學

容斥原理+質因數分解+組合數學

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