[求助帖] 奇奇妙妙地wa了(?)
查看原帖
[求助帖] 奇奇妙妙地wa了(?)
347813
cherubim楼主2021/2/17 19:04

rt,本题蒟蒻一直不知道怎么改,#8始终过不了

又因为奇奇怪怪的测评方式不知道后面的点怎么样

这道题和sp17247 貌似一样,但是两道题都过不去

多倍经验过来的

真心不知道在哪错了明明数字计数都过了

求大佬帮忙看看,感激不尽 /膜

(思路都在注释中)

//设f[i][j][k]表示第i位,最高位为j,k有多少个。
//f[i][j][k]= (l=0∑9)f[i-1][l][k]+一个数。
//这一个数是指k在这一位上出现的次数。
#include<bits/stdc++.h>
//#define int long long
#define N 1000010
#define INF 1<<30
#define mod 100000007
using namespace std;
int cnt=0;
int a,b;
int f[100][100][100];
int solve(int x,int num){
	int kkk[20];
	int ans=0,len=0;
	memset(kkk,0,sizeof(kkk));
	while(x!=0){
	kkk[++len]=x%10;
	x/=10;
	}
	for(int i=1;i<len;i++){
		for(int j=1;j<=9;j++){
			ans+=f[i][j][num]%mod;
		}
	}
	for(int i=1;i<kkk[len];i++)  //统计位数与原数一样,但最高位较小的数,同样不能有前导零;
		ans+=f[len][i][num]%mod;
    for(int i=len-1;i>=1;i--){
    	for(int j=0;j<kkk[i];j++){
    		ans+=f[i][j][num]%mod;
		}
		for(int j=len;j>i;j--){
			if(kkk[j]==num){
				ans+=(kkk[i]*pow(10,i-1));
				ans=ans%mod;
			}
		}
	}
	return ans%mod;

}
signed main()
{
	int k;
	cin>>k;
	while(k--){
		//初始化 
		memset(f,0,sizeof(f));
		cnt=0;
		
		cin>>a>>b;
		for(int i=0;i<=9;i++) f[1][i][i]=1;
		for(int i=2;i<=13;i++){//总共的位数 
			for(int j=0;j<=9;j++){ //此位数 
				for(int l=0;l<=9;l++){//上位数 
					for(int r=0;r<=9;r++){ //统计 
						f[i][j][r]+=f[i-1][l][r]; 
					}
				}
				f[i][j][j]+=pow(10,i-1);
			}
		}
		for(int i=0;i<=9;i++)
			cnt+=(((solve(b+1,i)-solve(a,i))+mod)*i+mod)%mod;
		printf("%lld\n", cnt );
	}
	return 0;
}
2021/2/17 19:04
加载中...