codeforces 204A Little Elephant and Interval(數位分解)
阿新 • • 發佈:2018-12-01
題意,給你兩個數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; }