http://poj.org/problem?id=3286
#include<iostream> #include<cstdio> #include<cstdlib> #include<ctime> #include<queue> #include<cstring> #include<set> #include<cmath> #include<algorithm> #define LL long long using namespace std; LL Fsum(LL x) { if(x==-1) return 0; if(x<10) return 1; LL sum=x/10+1;//末位为0的情况 for(LL i=10;i*10<=x;i=i*10)//依次向高位排查 { if(x/i%10!=0) { sum+=(i)*(x/i/10);//此位为非0 它变成0后 它前可以有i 种情况这样后面有 x/i/10 种情况 都比它小 }else { sum+=(x/i/10-1)*i+(x%i)+1;//此为为0 比较特殊的是当后面达到最大时 前面的情况数量变了 } } //cout<<sum<<endl; return (sum); } int main() { //freopen("data.txt","r",stdin); LL a,b; while(cin>>a>>b) { if(a==-1&&b==-1) break; cout<<(Fsum(b)-Fsum(a-1))<<endl;; } return 0; }