這道題可以根據組合數的實際意義來理解,就是從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 #include7using
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 一行乙個整數代表答案...