Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define endl '\n'
- using namespace std;
- #ifdef ONLINE_JUDGE
- #define eprintf(...) 42
- #else
- #define eprintf(...) {fprintf(stderr, __VA_ARGS__);fflush(stderr);}
- #endif
- clock_t startTime;
- double getCurrentTime()
- {
- return (double)(clock() - startTime) / CLOCKS_PER_SEC;
- }
- string lo, hi;
- long long dp[21][165][2][2];
- long long digit_dp(int level, int tar, bool lo_lim, bool hi_lim)
- {
- if(tar<0)
- {
- return 0;
- }
- if(level==19)
- {
- return (tar==0);
- }
- if(dp[level][tar][lo_lim][hi_lim]!=-1)
- {
- return dp[level][tar][lo_lim][hi_lim];
- }
- int l=0, r=9;
- long long ans = 0;
- if(lo_lim)
- {
- l = lo[level]-'0';
- }
- if(hi_lim)
- {
- r = hi[level]-'0';
- }
- for(int i=l; i<=r; i++)
- {
- bool l1, l2;
- l1 = (i==lo[level]-'0' && lo_lim);
- l2 = (i==hi[level]-'0' && hi_lim);
- ans += digit_dp(level+1, tar-i, l1, l2);
- }
- return dp[level][tar][lo_lim][hi_lim] = ans;
- }
- vector<long long> solve(long long l, long long r)
- {
- memset(dp, -1, sizeof(dp));
- lo = to_string(l); hi = to_string(r);
- reverse(lo.begin(), lo.end()); reverse(hi.begin(), hi.end());
- while(lo.size()<19)
- {
- lo.push_back('0');
- }
- while(hi.size()<19)
- {
- hi.push_back('0');
- }
- reverse(lo.begin(), lo.end()); reverse(hi.begin(), hi.end());
- long long ans[163] = { 0 };
- long long a=-1, b=0;
- for(int i=0; i<163; i++)
- {
- ans[i] = digit_dp(0, i, 1, 1);
- if(a<ans[i])
- {
- a = ans[i]; b = 1;
- }
- else if(a==ans[i])
- {
- b++;
- }
- }
- return {a, b};
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin.tie(0);
- int t;
- cin>>t;
- startTime = clock();
- while(t--)
- {
- long long l, r;
- cin>>l>>r;
- for(auto stuff : solve(l, r))
- {
- cout<<stuff<<" ";
- }
- cout<<endl;
- }
- eprintf("time = %.5lf\n", getCurrentTime());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment