QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#747859 | #9631. Median Replacement | IllusionaryDominance# | WA | 4ms | 7880kb | C++20 | 4.3kb | 2024-11-14 18:30:18 | 2024-11-14 18:30:21 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define all(x) (x).begin(), (x).end()
const int p = 1e9+7;
const int N = 155<<1;
#define int long long
int inv[N], ifac[N], val[N];
int fpow(int x, int y)
{
int r=1;
for(;y;y>>=1,x=(ll)x*x%p) if(y&1) r=(ll)r*x%p;
return r;
}
struct node
{
int a[N];
int l[N], r[N];
int m;
void init(int *v, int M)
{
int i; m=M;
for(int i=1;i<=m;++i) a[i]=v[i];
}
int F(ll n)
{
int i; int ans = 0, rr = 0;
if (n<=m) return a[n];
l[0]=1;r[m+1]=1;
for (i=1;i<m;i++) l[i]=(ll)l[i-1]*(n-i)%p;
for (i=m;i;i--) r[i]=(ll)r[i+1]*(n-i)%p;
for (i=1;i<=m;i++)
{
if ((m^i)&1) rr=p-a[i]; else rr=a[i];
ans=(ans+(ll)rr*ifac[i-1]%p*ifac[m-i]%p*l[i-1]%p*r[i+1])%p;
}
return ans;
}
} sum[N];
void init()
{
ifac[0]=inv[1]=1;
for (int i=2;i<=300;i++) inv[i]=p-(ll)p/i*inv[p%i]%p;
for (int i=1;i<=300;i++) ifac[i]=(ll)ifac[i-1]*inv[i]%p;
for(int k=0; k<=200; ++k)
{
val[0] = 0;
for(int i=1;i<=k+3;++i) val[i]=(val[i-1]+fpow(i, k))%p;
sum[k].init(val, k+3);
}
}
int getsum(int k, ll l, ll r)
{
return (sum[k].F(r) + (p - sum[k].F(l-1))) % p;
}
struct Poly
{
array<int, 155> coef;
Poly(int x) {fill(all(coef), 0); coef[0] = x;}
Poly() {fill(all(coef), 0);}
Poly operator + (const Poly &b) const
{
Poly ret(0);
for (int i = 0; i < 155; ++i) ret.coef[i] = (coef[i] + b.coef[i]) % p;
return ret;
}
Poly operator * (const int d) const
{
Poly ret(0);
for (int i = 0; i < 155; ++i) ret.coef[i] = ((ll)coef[i] * d) % p;
return ret;
}
Poly shift() const
{
Poly ret(0);
ret.coef[0] = 0;
for (int i = 1; i < 155; ++i) ret.coef[i] = coef[i-1];
return ret;
}
Poly get (int a1, int a2) const
{
return ((*this).shift() * a1) + (*this) * a2;
}
int pos(int i) const { return coef[i]; }
};
int n;
int l[N], r[N];
Poly f[N][2][2][2], g;
void solve()
{
cin >> n;
vector<int> num;
for (int i=1; i<=n; ++i) cin>>l[i];
for (int i=1; i<=n; ++i) cin>>r[i], num.push_back(l[i]), num.push_back(r[i]+1) ;
sort(all(num));
num.erase(unique(all(num)), num.end());
int ans=0;
for (int _tmp = 0; _tmp < num.size() - 1; ++_tmp)
{
int L=num[_tmp], R=num[_tmp+1]-1;
for (int ok=0; ok<2; ++ok)
for (int a=0; a<2; ++a)
for (int b=0; b<2; ++b)
f[0][ok][a][b] = Poly(0);
f[0][0][0][0] = Poly(1);
for (int i=0; i<n; ++i)
{
for (int ok=0; ok<2; ++ok)
for (int a=0; a<2; ++a)
for (int b=0; b<2; ++b)
f[i+1][ok][a][b] = Poly(0);
for (int ok=0; ok<2; ++ok)
for (int a=0; a<2; ++a)
for (int b=0; b<2; ++b)
for (int c=0; c<2; ++c)
// for (int c=(1-(l[i+1]<L)); c<=(r[i+1]>=L); ++c)
{
if (c)
{
if(r[i+1] < L) continue;
if (R <= r[i+1] && L >= l[i+1])
{
f[i+1][ok|(a+b+c>=2)][b][c] = f[i+1][ok|(a+b+c>=2)][b][c] + f[i][ok][a][b].get(p-1, r[i+1]+1);
}
else
{
assert(l[i+1] > R);
f[i+1][ok|(a+b+c>=2)][b][c] = f[i+1][ok|(a+b+c>=2)][b][c] + f[i][ok][a][b] * (r[i+1] - l[i+1] + 1);
}
}
else
{
if (l[i+1] > R) continue;
if (R <= r[i+1] && L >= l[i+1])
{
f[i+1][ok|(a+b+c>=2)][b][c] = f[i+1][ok|(a+b+c>=2)][b][c] + f[i][ok][a][b].get(1, p-l[i+1]);
}
else
{
assert(r[i+1] < L);
f[i+1][ok|(a+b+c>=2)][b][c] = f[i+1][ok|(a+b+c>=2)][b][c] + f[i][ok][a][b] * (r[i+1] - l[i+1] + 1);
}
}
}
}
g = Poly(0);
for (int a=0; a<2; ++a) for (int b=0; b<2; ++b) g=g+f[n][1][a][b];
for(int i=0; i<15; ++i)
(ans += (ll)g.pos(i) * getsum(i, L, R) % p) %= p;
}
cout << ans << "\n";
}
signed main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
init();
int T;
cin >> T;
while (T--)
{
solve();
}
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 4ms
memory: 7880kb
input:
10 5 5 1 4 3 2 14 2 5 3 2 5 4 5 1 2 3 13 7 1 2 3 5 5 2 5 3 1 10 2 12 3 2 5 5 5 3 1 5 57 5 3 1 5 5 2 2 3 3 5 4 5 4 4 5 5 4 5 3 5 3 13 7 3 5 3 5 5 1 4 2 3 14 3 4 2 3 5 1 2 5 4 5 2 8 5 7 5 5 1 1 3 5 1 8 2 3 8 1 5 4 4 4 2 3 5 10 5 2 3
output:
180 170 650 265 134 113 120 296 192 103
result:
wrong answer 5th lines differ - expected: '182', found: '134'