Shoi2017 組合數問題 BZOJ4870

2022-05-11 03:26:38 字數 1035 閱讀 5839

這道題可以根據組合數的實際意義來理解,就是從n*k個物品中選擇除k餘r個物品的方案數,那麼就可以得到用f[i][j]表示在前i個物品中,選擇j個物品的方案數,其中j是對k取模後的結果,那麼f[i][j]=f[i-1][j](在第i為不取)+f[i-1][(j-1+k)%k](在第i為取),可以發現,第i位只與i-1位有關係那麼久可以用矩陣快速冪優化,

在做矩陣乘法的時候,要特別注意矩陣乘特別容易爆int,所以矩陣陣列要開成long long 

另外這道題還有乙個坑點,就是當k=1,r=0是,轉移到f[i][0]的兩部分是相同的,所以在初始矩陣的時候不能簡單的把a[i][j]賦值成1,而應該把a[i][j]++;

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8int

n,p,k,r;

9int f[60

];10

int a[60][60

];11

long

long c[60

];12

void

cheng1()19}

20for(int i=0;i)

21 f[i]=c[i];22}

23long

long d[60][60

];24

void

cheng2()32}

33}34for(int i=0;i)38}

39}40int

main()

51 a[(i-1)][i]++; 52}

53long

long t=(long

long)n*k;

54while

(t)58

cheng2();

59 t=t>>1;60

//cout<<"t= "<61

}62 cout63return0;

6465 }

SHOI2017 組合數問題

給定 n,r,k,p 1 leq n leq 10 9 0 leq r,k leq 50 2 leq p leq 2 1 求 left sum infty right mod p 即 c c c c c mod p 根據 c 的另乙個遞推式 c c c 我們做一些改變 令 dp 表示取 i 個,取的...

Bzoj4870 SHOI2017 組合數問題

題目顯得一臉不可做。一般的來說,讀題是不會看前面一些沒有什麼太大意義的話的。確實也如此,譬如題面首句 組合數cm n 表示的是從n個互不相同的物品中選出m個的方案數 想來大家也是知道的 再觀察前面的式子 可以表示成如下形式 q modk rcq n k 回顧題面首句 代入?可以得到講人話的題面,大致...

bzoj4870 Shoi2017 組合數問題

time limit 10 sec memory limit 512 mb submit 747 solved 397 submit status discuss 第一行有四個整數 n,p,k,r,所有整數含義見問題描述。1 n 10 9,0 r k 50,2 p 2 30 1 一行乙個整數代表答案...