1. 程式人生 > >codeforces 204A Little Elephant and Interval(數位分解)

codeforces 204A Little Elephant and Interval(數位分解)

 

 

題意,給你兩個數l,r。求從l-r中有多少個數字滿足首位=末位。(看note的那些數字都是首位=末位的數字)

由於資料上限1e18,可以用ll儲存,直接開ll,然後for迴圈i遍歷1-18位,內部for迴圈j遍歷1-9的數字。

然後定義一個low代表下界,high代表上界。low=max(l,10^(i-1)),這裡max的作用是不統計1-l這些數有多少個符合要求。

上界則為min(r,2*10^(i-1)-1)

例如i=2,j=1時,可以計算100-max(r,199)中,有多少個數字滿足首位=末位。計算方法是先用while迴圈使個位數=百位數,然後做差。

ans+=(high-low)/10+1

ans中的這個+1代表中間全是0的數字(在上述例子中為101)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
	ll l,r,ten=1,ans=0;
	cin>>l>>r;
	for(int i=1;i<=18;i++){
		for(int j=1;j<=9;j++){
			ll low=max(l,j*ten),high=min(r,(j+1)*ten-1);
			while(low%10!=j)	low++;
			while((high+10)%10!=j)	high--;
			if(high>=low)	ans+=(high-low)/10+1;
		}
		ten*=10;
	}
	cout<<ans;
}