牛客竞赛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 <bits/stdc++.h>
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 28
            if (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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值