牛客竞赛1 F

Find 3-friendly Integers

/*
ans=[1,r]内的友好数个数减去[1,l-1]内的个数
当边界x为一位数时 ans=x/3;
x为两位数时
10~19 7个 (除 11 14 17)
20~29 7个(除 22 25 28)
30~39 10个
由于取模
40+,70+ 等同于 10+
50+,80+ 等同于 20+
60+,90+ 等同于30+

x为三位数时,
当后两位为友好数时,x必为友好数
当后两位不是友好数时,百位添 1或2 要么前两位是友好数,要么整个数是三的倍数
百位添 3 一定是友好数
由于取模,添 4,5,6,7,8,9 时等同
所以大于等于100的数一定是友好数

*/

#include 
using namespace std;
typedef long long ll;
ll ans;
const int maxn=2005;
int a[9]={0,7,14,24,31,38,48,55,62};
int b[10]={1,1,2,3,3,4,5,5,6,7};//10+
int c[10]={1,2,2,3,4,4,5,6,6,7};//20+
ll solve(ll x)
{ll t=0;if(x<10) {t=x/3;return t;	}	else if(x<100){ll k1=x/10;t+=a[k1-1];ll k2=x%10;if(k1%3==0) t+=k2+1;else if(k1%3==1) t+=b[k2];else if(k1%3==2) t+=c[k2];return t+3;	}else return (x-100+76) ;
}int main()
{int n;cin>>n;for(int i=1;i<=n;i++){ll l,r;cin>>l>>r;cout<<solve(r)-solve(l-1)<<endl; }return 0;}

//超强队友!!!

#include "bits/stdc++.h"using namespace std;
long long shu(long long x){if (x < 10){return x / 3 + 1;// 0 也算上了}long long int ans = 4;// 0也算上了if (x < 100){for (int i = 10; i <= x; i++){int a = i / 10;int b = i % 10;// 特判 11 14 17     22 25 28if (a % 3 == b % 3){if (a % 3 == 0) ans++;}else ans++;}}else {ans = 76 + x - 100 + 1; }return ans;
}
int main(){int t;cin >> t;while(t--){long long l, r;cin >> l >> r;//cout << shu(l) << " " << shu(r) << endl;cout << shu(r) - shu(l - 1) << endl;}return 0;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部