時間限制: 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的情況。...