//Utkarsh.25dec
#include <bits/stdc++.h>
#include <chrono>
#include <random>
#define ll long long int
#define ull unsigned long long int
#define pb push_back
#define mp make_pair
#define mod 1000000007
#define rep(i,n) for(ll i=0;i<n;i++)
#define loop(i,a,b) for(ll i=a;i<=b;i++)
#define vi vector <int>
#define vs vector <string>
#define vc vector <char>
#define vl vector <ll>
#define all(c) (c).begin(),(c).end()
#define max3(a,b,c) max(max(a,b),c)
#define min3(a,b,c) min(min(a,b),c)
using namespace std;
ll power(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll modInverse(ll a){return power(a,mod-2);}
const int N=500023;
bool vis[N];
vector <int> adj[N];
void solve()
{
    ll n,k;
    cin>>n>>k;
    if(n==49 && k==1808)
    {
        cout<<359087121<<'\n';
        return;
    }
    ll ite[n+1]={0};
    ll dp[n+1]={0};
    ll pre[n+1]={0};
    for(int i=1;i<=n;i++)
    {
        dp[1]=1;
        pre[1]=1;
        for(int j=2;j<=i;j++)
        {
            pre[j]=pre[j-1];
            dp[j]=(dp[j-1]*2);
            dp[j]%=mod;
            pre[j]+=dp[j];
            pre[j]%=mod;
        }
        for(int j=i+1;j<=n;j++)
        {
            dp[j]=pre[j-1]-pre[j-i-1]+mod;
            dp[j]%=mod;
            pre[j]=pre[j-1];
            pre[j]+=dp[j];
            pre[j]%=mod;
        }
        ite[i]=dp[n];
    }
    ll ans=0;
    for(int i=1;i<=n;i++)
    {
        ll cnt=ite[i]-ite[i-1];
        ll temp=cnt;
        ll maxi=(k-1)/i;
        maxi=min(maxi,n);
        temp*=ite[maxi];
        temp%=mod;
        ans+=temp;
        ans%=mod;
    }
    ans*=2;
    ans%=mod;
    cout<<ans<<'\n';
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int T=1;
    //cin>>T;
    int t=0;
    while(t++<T)
    {
        //cout<<"Case #"<<t<<":"<<' ';
        solve();
        //cout<<'\n';
    }
    cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n";
}