D=aC4×7bD = {}_aC_4 × 7^b

制約より、 aC4×7b{}_aC_4 × 7^b を満たす整数値は 10910^9 まで調べればいいです。 (a,b)=(1,1),(1,2),(1,3)......(2,1),(2,2)...(a,b)=(1,1),(1,2),(1,3)......(2,1),(2,2)... というように a,ba,b に値を代入して、 DD が取りうる値を配列に記録していきます。

aa の取りうる値ですが、 大きく見積もると

(a3)424<aC4=a(a1)(a2)(a3)1×2×3×4109\frac{(a-3)^4}{24} <{}_aC_4 =\frac{a(a-1)(a-2)(a-3)}{1×2×3×4} ≤10^9

より、 だいたい (4)a<397(4≤) a<397 くらいまでを調べれば良いことが分かります。

bb の取りうる値は 7b1097^b≤10^9 なので、 だいたい b<11b<11 くらいです。

ab4000ab≒4000 くらいなので、 全捜索しても十分高速に計算できます)

念の為オーバーフローには十分注意してください。 この全捜索における最大値は 396C4×7102.9×1017{}_{396}C_4 × 7^{10} ≒ 2.9×10^{17} であるので、 long long 型にしておけば安心です。 10910^9 を越したら break とか実装すればもっと安心です。

全捜索したあとは配列を昇順にソートし、 重複している項目を削除します。 (実装時には配列を新しく用意しています)

#include <stdio.h>
#include <stdlib.h>
#define ll long long

//比較関数(昇順)
ll cmp(const void* x, const void* y)
{
	if (*(ll*)x > * (ll*)y) return 1;

	else if (*(ll*)x < *(ll*)y) return -1;

	else return 0;  // ロイロからコピペしてきた
}

ll pow_(ll a, ll b){
    ll ans=1;
    for(int i=0; i<b; i++) ans*=a;
    return ans;
}

int main(void){
    ll l, r;  scanf("%lld%lld", &l, &r);
    
    // 全捜索
    ll D[4000];
    int D_count=0;
    for(ll a=4; a<397; a++){
        for(ll b=1; b<11; b++){
            
            ll insert = a*(a-1)*(a-2)*(a-3)/24 * pow_(7,b);
            
            if(insert > (ll)1e9) break;
            
            D[D_count] = insert;
            D_count++;
        }
    }
    
    // ソート
    qsort(D, D_count, sizeof(ll), cmp);
    
    // 重複を削除
    ll E[4000];
    E[0] = D[0];
    int E_count=1;
    for(int i=1; i<D_count; i++){
        if(D[i]!=D[i-1]){
            E[E_count] = D[i];
            E_count++;
        }
    }
    
    int L=0, R=E_count-1;
    while(l>E[L] && L<E_count-1) L++;
    while(r<E[R] && 0<R) R--;
    
    printf("%d\n", R-L+1);
}