题解:P12975 疯狂星期四

· · 题解

首先想到 dp。

f_{i,j} 表示从 1i 的格子里数的和,对 7 取余余数为 j

转移应为 f_{i,j}=f_{i-1,j}+\sum_{k=0}^6{f_{i-1,k}},可以理解为后面的一部分是第 i 格填 06,前面是填 7

时间复杂度 O(n),可惜 n 太大,似乎无法优化。

发现对于相同的 i 来说,后面的求和是相同的,只有前面一部分影响 i 相同的 f_{i,j} 的值。当 i=1 时,不难发现 f_{1,0}=2,而 f_{1,1}=f_{1,2}=…=f_{i,6}=1

所以,对于任意的 i,就都有 f_{i,0}=f_{i,1}+1=…=f_{i,6}+1

又因为总共有 8^n 种方案,就有 f_{n,0}+6 \times (f_{n,0}-1)=8^n,解得 f_{n,0}=\frac {8^n+6}{7}

```cpp #include<bits/stdc++.h> using namespace std; const int mod=101; int ksm(int a,int b) { int res=1; while(b) { if(b&1) res=res*a%mod; a=a*a%mod; b>>=1; } return res; } int n; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); char c; while(cin>>c) n=(n*10+(c-'0'))%100; cout<<(ksm(8,n)+6)%mod*ksm(7,mod-2)%mod; return 0; } ```