QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#747811#9631. Median ReplacementIllusionaryDominance#WA 0ms6000kbC++204.2kb2024-11-14 18:20:542024-11-14 18:20:58

Judging History

你现在查看的是最新测评结果

  • [2024-11-14 18:20:58]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:6000kb
  • [2024-11-14 18:20:54]
  • 提交

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;

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 
            {
                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 
            {
                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";
}

int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    
    init();
     
    int T;
    cin >> T;
    while (T--) 
    {
        solve();
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 6000kb

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'