站外题求助
  • 板块学术版
  • 楼主Shaber
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/10/2 09:53
  • 上次更新2023/11/4 05:11:09
查看原帖
站外题求助
244239
Shaber楼主2021/10/2 09:53
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
long long n,p,f[1005][150];
int main() {
	n=read();p=read();
	//求有多少n位数,使得对于任何x∈[0,6],都有其前k位组成的数%7=x(如1234,前三位123%7=4) 
	//思路如下:数位dp,将模数状态状压,f[i][j]表示前i个数状态为j的方案
	//所以先枚举上一个状态j,上一次余数k,这一位的数t,统计答案 
	for(int i=0;i<=9;i++) f[1][1<<(i%7)]++;
	for(int i=2;i<=n;i++) 
	    for(int j=0;j<=127;j++) {
	    	//cout<<1112<<'\n';
	    	if(!f[i-1][j]) continue; 
	    	//f[i][j]=(f[i][j]+f[i-1][j])%p;
	        int pow=0;
	    	for(int k=1;k<=64;k=(k<<1)) {
	    		pow++;
	    		//cout<<(j&k)<<'\n';
	    		if((j&k)==0) continue;
	    		for(int t=0;t<=9;t++) {
	    			f[i][((10*pow+t)%7)|j]=(f[i][((10*pow+t)%7)|j]+f[i-1][j])%p;
	    			//cout<<111<<'\n';
				}
			}
		} 
	cout<<f[n][127]<<'\n';       
	
} 
2021/10/2 09:53
加载中...