专栏文章

题解:P12975 疯狂星期四

P12975题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miozoxxg
此快照首次捕获于
2025/12/03 03:47
3 个月前
此快照最后确认于
2025/12/03 03:47
3 个月前
查看原文
首先想到 dp。
fi,jf_{i,j} 表示从 11ii 的格子里数的和,对 77 取余余数为 jj
转移应为 fi,j=fi1,j+k=06fi1,kf_{i,j}=f_{i-1,j}+\sum_{k=0}^6{f_{i-1,k}},可以理解为后面的一部分是第 ii 格填 0066,前面是填 77
时间复杂度 O(n)O(n),可惜 nn 太大,似乎无法优化。
发现对于相同的 ii 来说,后面的求和是相同的,只有前面一部分影响 ii 相同的 fi,jf_{i,j} 的值。当 i=1i=1 时,不难发现 f1,0=2f_{1,0}=2,而 f1,1=f1,2==fi,6=1f_{1,1}=f_{1,2}=…=f_{i,6}=1
所以,对于任意的 ii,就都有 fi,0=fi,1+1==fi,6+1f_{i,0}=f_{i,1}+1=…=f_{i,6}+1
又因为总共有 8n8^n 种方案,就有 fn,0+6×(fn,01)=8nf_{n,0}+6 \times (f_{n,0}-1)=8^n,解得 fn,0=8n+67f_{n,0}=\frac {8^n+6}{7}
101101 是质数,由费马小定理得 8n8nmod100(mod101)8^n \equiv8^{n\bmod100} \pmod {101} ,然后在处理逆元计算。
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;	
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...