[HDU4507]吉哥系列故事——恨7不成妻

写完忘了账号,试了N久。记搜的时候mod了N次,还是不对。发现自己SB的把solve里面传的值写成int了。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
const int mod=1e9+7;
struct Node{
	long long cnt,sum,sqsum;
};
long long wei,a[21],T,ans;long long l,r,poww[25];
Node f[21][8][8];
Node dfs(int pos,int m7,int wm7,bool lim) {
	if(pos==-1) {
		return (Node){m7&&wm7,0,0};
	}
	if(~ f[pos][m7][wm7].cnt&&lim==false) return f[pos][m7][wm7];
	int mx=lim?a[pos]:9;
	Node dp;
	dp.cnt=dp.sqsum=dp.sum=0;
	for(int i=0;i<=mx;i++) {
		if(i==7) continue;
		Node tmp=dfs(pos-1,(m7*10+i)%7,(wm7+i)%7,lim&&(i==mx));
		dp.cnt=(dp.cnt+tmp.cnt)%mod;
		dp.sum=(dp.sum+tmp.sum%mod+(poww[pos]*i)%mod*tmp.cnt%mod)%mod;
		dp.sqsum=(dp.sqsum+(2*poww[pos]*i)%mod*tmp.sum%mod+(tmp.cnt*poww[pos])%mod*poww[pos]%mod*i%mod*i%mod+tmp.sqsum)%mod;
	}
	if(!lim) f[pos][m7][wm7]=dp;
	return dp;
}
long long solve(long long x) {
	memset(f,-1,sizeof f);wei=0;
	while(x) a[wei++]=x%10,x/=10;
	return dfs(wei-1,0,0,1).sqsum;
}
int main() {
	freopen("in.txt","r",stdin);//freopen("out1.txt","w",stdout);
	poww[0]=1;
	for(int i=1;i<=20;i++) poww[i]=(poww[i-1]*10)%mod;
	for(int i=0;i<20;i++)
	for(int j=0;j<8;j++)
	for(int k=0;k<8;k++)
	f[i][j][k].cnt=-1;
	cin>>T;
	while(T--){
		cin>>l>>r;
		ans=solve(r)-solve(l-1);ans=(ans%mod+mod)%mod;
		printf("%d
",ans);
	}
}
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9477552.html