P2602 0pts 求调
  • 板块学术版
  • 楼主FormulaOne
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/15 08:19
  • 上次更新2023/11/3 03:44:12
查看原帖
P2602 0pts 求调
180406
FormulaOne楼主2023/8/15 08:19

rt,悬关

#include <iostream>
#include <cstdio>
#define int long long

using namespace std;

int l,r,a[10],b[10],num[21],nw[21],len,ll,rr;
int dp[21][10];

int qp( int x , int y )
{
	int c = 1;
	while( y )
	{
		if( y & 1 ) c = c * y;
		y >>= 1;
		x = x * x;
	}
	return c;
}

int dfs( int siz , int lim , int zero , int dig )
{
	if( siz == 0 ) return 0;
	if( !lim && !zero && dp[siz][dig] ) return dp[siz][dig];
	int sum = 0;
	for( int i = 0 ; i <= ( lim ? num[siz] : 9 ) ; i ++ )	
	{
		int z = ( zero && i == 0 ),l = ( lim && i == num[siz] );
		if( !z && i == dig )
		{
			if( l )
			{
				int cnt = 0;
				for( int i = siz - 1 ; i >= 1 ; i -- )
					cnt = cnt * 10 + num[i];
				sum += cnt;
			}
			else
			{
				int cnt = 1;
				for( int i = siz - 1 ; i >= 1 ; i -- )
					cnt = cnt * 10;
				sum += cnt;
			}
		} 
		sum += dfs( siz - 1 , l , z , dig );
	}
	dp[siz][dig] = sum;
	return dp[siz][dig];
}

void solve( void )
{
	ll = l;
	while( l )
	{
		num[++ len] = l % 10;
		l /= 10;
	}
	l = ll;
	for( int i = 0 ; i <= 9 ; i ++ )
		a[i] = dfs( len , 1 , 1 , i );
	r ++;
	rr = r;
	len = 0;
	while( r )
	{
		num[++ len] = r % 10;
		r /= 10;
	}
	r = rr;
	for( int i = 0 ; i <= 9 ; i ++ )
		b[i] = dfs( len , 1 , 1 , i );
//	while( l )
//	{
//		b[l % 10] ++;
//		l /= 10;
//	}
	for( int i = 0 ; i <= 9 ; i ++ )
		cout << b[i] - a[i] << ' ';
	return;
	
}

signed main()
{
	cin >> l >> r;
	solve();
	return 0;
}
2023/8/15 08:19
加载中...