是的,通式要分很多类,暂时没找到好算法
小朋友编的,通过- #include<stdio.h>
- using namespace std;
- int h(int n,int m){
- int H=1;
- for(int i=0;i<m;i++,n--)H*=n;
- return H;
- }
- int g(int n){
- if(!n)return 0;
- int a[10],num=0,G=0;
- bool b[10]={1,1,1,1,1,1,1,1,1,1};
- while(n){
- num++;
- a[num]=n%10;
- n/=10;
- }
- for(int i=num;i>1;i--){
- for(int j=!(num-i);j<a[i];j++)if(b[j])G+=h(10-num+i-1,i-1);
- if(b[a[i]]){
- b[a[i]]=0;
- }
- else return G;
- }
- for(int j=!(num-1);j<=a[1];j++)if(b[j])G++;
- return G;
- }
- int t(int n){
- int T=0;
- int num=0,sum=9;
- while(n>sum){
- num++;
- sum=sum*10+9;
- T+=9*h(9,num-1);
- }
- return T;
- }
- int f(int n){
- int F=0;
- F+=t(n);
- F+=g(n);
- return F;
- }
- int main(){
- int t;
- scanf("%d",&t);
- for(int i=0;i<t;i++){
- int l,r;
- scanf("%d%d",&l,&r);
- printf("%d\n",f(r)-f(l-1));
- }
- return 0;
- }
复制代码 |