简单预处理一个k次幂前缀和,然后n^3 dp即可,dp当前用了多少个candies方案贡献和。
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define sc second
#define pb push_back
#define ll long long
#define trav(v,x) for(auto v:x)
#define all(x) (x).begin(), (x).end()
#define VI vector<int>
#define VLL vector<ll>
#define pll pair<ll, ll>
#define double long double
//#define int long long
using namespace std;
const int N = 1e6 + 100;
const int inf = 1e9;
//const ll inf = 1e18;
const ll mod = 1e9 + 7;
#ifdef LOCAL
void debug_out(){cerr << endl;}
template<typename Head, typename... Tail>
void debug_out(Head H, Tail... T)
{
cerr << " " << to_string(H);
debug_out(T...);
}
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
void sol()
{
int n, m;
vector<VLL> sum(405, VLL(405));
n = 400;
auto qpow = [&](ll x, ll y)
{
ll res = 1;
while(y)
{
if(y & 1)
res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res;
};
for(int j = 0; j <= n; j++)
{
for(int i = 1; i <= n; i++)
{
sum[i][j] = (sum[i - 1][j] + qpow(i, j)) % mod;
}
}
cin >> n >> m;
VI a(n), b(n);
for(int i = 0; i < n; i++)
cin >> a[i];
for(int i = 0; i < n; i++)
cin >> b[i];
VLL dp(m + 1), dq(m + 1);
dp[0] = 1;
for(int i = 0; i < n; i++)
{
fill(all(dq), 0);
for(int use = 0; use <= m; use++)
{
for(int j = 0; j + use <= m; j++)
{
dq[use + j] = (dq[use + j] + dp[j] * (sum[b[i]][use] - sum[a[i] - 1][use] + mod)) % mod;
}
}
swap(dp, dq);
// for(int j = 0; j <= m; j++)
// cerr << dp[j] << " \n"[j == m];
}
cout << dp[m] << '\n';
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
// int tt;
// cin >> tt;
// while(tt--)
sol();
}