1 条题解

  • 0
    @ 2024-12-24 9:54:31

    C++ :

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <cmath>
    #include <string>
    #include <set>
    #include <map>
    #define NBIT 9
    #define getten(a) (a/10)
    #define getge(a) (a%10)
    #define isten(a) (a >= 10)
    
    using namespace std ;
    
    int f[15][15], p ;
    int dig[15] ;
    
    void init ()
    {
    	memset (f, 0, sizeof(f)) ;
    	f[0][0] = 1 ;
    	for (int i=1; i<=NBIT; i++)
    		for (int j=0; j<=9; j++)
    			for (int k=0; k<=9; k++)
    				if ((!isten(p) && j != getge(p)) || (isten(p) && !(j == getten(p) && k == getge(p))))
    					f[i][j] += f[i-1][k] ;
    }
    
    int getdig (int n)
    {
    	int len = 0 ;
    	while (n)
    	{
    		dig[++len] = n % 10 ;
    		n /= 10 ;
    	}
    	
    	return len ;
    }
    
    int getcount (int n)
    {
    	n++ ;
    	
    	int len = getdig (n) ;
    	int ans = 0 ;
    	for (int i=len; i>0; i--)
    	{
    		for (int j=0; j<dig[i]; j++)   //个位数的最后一位没统计到,所以统计的为[0, n-1],要+1
    			if ((!isten(p) && j != getge(p)) || (isten(p) && !(i < len && dig[i+1] == getten(p) && j == getge(p))))
    				ans += f[i][j] ;
    		if ((!isten(p) && dig[i] == getge(p)) || (isten(p) && (i < len && dig[i+1] == getten(p) && dig[i] == getge(p))))
    			break ;
    	}
    	
    	return ans ;
    }
    
    int main()
    {
    	int n, m, t ;
    	scanf ("%d%d", &t, &p) ;
    	init () ;
    	
    	for (int i=0; i<t; i++)
    	{
    		scanf ("%d%d", &n, &m) ;
    		printf ("%d\n", getcount(m) - getcount(n-1)) ;
    	}
    
    	return 0 ;
    }
    
    • 1

    信息

    ID
    1185
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者