學校OJ 組合數學 無關的元素

2021-08-03 13:19:57 字數 1536 閱讀 4839

時間限制: 1 sec  

記憶體限制: 128 mb

提交: 193  

解決: 42 [

提交][

狀態][

我的提交]

對於給定的n個數a1,a2,...,an,依次求出相鄰兩數之和,將得到乙個新數列。重複上述操作,最後結果將變成乙個數。問這個數除以m的餘數與哪些數無關?

例如n=3,m=2時,第一次求和得到a1+a2,a2+a3,再次求和得到a1+2a2+a3,它除以2的餘數和a2無關。

第1行:2個整數n和m(1<=n<=10^5, 2 <=m<=10^9)

按公升序列出與m無關的元素的序號,每行1個。

若與全部元素無關,輸出0

copy

(如果複製到控制台無換行,可以先貼上到文字編輯器,再複製)

5 3

3

算算快有乙個月沒寫部落格了,必須趕快補一補,再不詐屍就火化了。。。話說最近在複習組合數學,偶然間發現以前一道沒有做出來的題,拿出來做做,沒想到一不小心就對了。。。

這一道題呢明顯是讓我們求合併完後每一項是否是m的倍數,考慮到合併完後可能一定會超出int甚至long long,所以我們絕對不能暴力模擬(好像說了一堆廢話),先不說怎麼判斷倍數,想個辦法儲存合併後的係數都比較困難。其實,我們可以用分解質因數的方法儲存,次數並不會很多,比較倍數就只需看每個質因子次數即可。而顯而易見的,合併完後的係數分布是楊輝三角的第n排,也就是c(n-1,i),又想起組合數的另乙個公式:

c(i,j)=i!/(j!*(i-j)!)

可以發現第10^5排的質因子並不會超過10^5,我們於是可以篩出乙個素數表。又因為只需判斷是否是m的倍數,所以只需儲存與m相關的質因數。m≤10^9,可以驗證2*3*5*7*11*13*17*19*23*29>m,前10個質數相乘就大於了m,意味著m的質因子種數最多為9,這樣下來,計算量並不大。求解第n排的c值也可以用上面那個公式,可以推出:

c(i,j)=c(i,j-1)/j*(i-j+1)

這意味著我們可以用遞推的方式計算這一排組合數了。

所以你們想要的**。。。

#include#include#include#includeusing namespace std;

const int n=100000;

int p[10005],cnt;

bool h[n+5];

int n,m,c;

int mys[15],mgs[15],ngs[15],cmt;

void add(int a,int wh) }}

int main()

scanf("%d%d",&n,&m);

n--;

if(m==1)

for(int i=1;i<=cnt&&m>1;i++)

}} if(m>1)

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

{ add(n-i+1,1);

add(i,-1);

int f=1;

for(int j=1;j<=cmt;j++)

{ if(ngs[j]

C 組合數例題 無關的元素

對於給定的n個數a1,a2,an,依次求出相鄰兩數之和,將得到乙個新數列。重複上述操作,最後結果將變成乙個數。問這個數除以m的餘數與哪些數無關?例如n 3,m 2時,第一次求和得到a1 a2,a2 a3,再次求和得到a1 2a2 a3,它除以2的餘數和a2無關。輸入 第1行 2個整數n和m 1 n ...

玲瓏oj 1032A B(組合數學)

1032 a b time limit 1s memory limit 128mbyte submissions 528solved 105 description 你有n個球,需要把他們放到m個盒子裡。要求擁有最多球的盒子唯一,問方案數。input 一行兩個數n m n m 500 output ...

組合數學 1的個數

mean 輸入乙個n,計算小於10 n的正整數中含有1的數的個數。analyse 這題是一道組合數學課後思考題。基本思路 組合數學乘法原則 容斥原理 n位數中,每位可選 所以共有10 n種,其中要除掉每位都為0的情況,所以要減一。其中每位上不選1的情況為 所以共有9 n中,同樣要除掉全部為0的情況。...