QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#805043#1245. Three ballspeimudaWA 1ms6100kbC++112.2kb2024-12-08 12:13:512024-12-08 12:13:52

Judging History

This is the latest submission verdict.

  • [2024-12-08 12:13:52]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 6100kb
  • [2024-12-08 12:13:51]
  • Submitted

answer

#include<set>
#include<map>
#include<queue>
#include<vector>
#include<algorithm>
#include<bits/stdc++.h>
#define pr pair
#define f first
#define s second
#define ll long long
#define mp make_pair
#define pll pr<ll,ll>
#define pii pr<int,int>
#define piii pr<int,pii>
using namespace std;
const ll m=1e9+7;
ll jc[10004];
ll jy[10004];
int pf[20004][10004];
int fd[10004],fa[10004],fb[10004],fc[10004];
ll C(int a,int b)
{
	return jc[a]*jy[b]%m*jy[a-b]%m;
}
ll pw(ll a,ll b=m-2)
{
	ll r=1;
	while(b)
	{
		if(b&1) r=r*a%m;
		a=a*a%m;
		b>>=1;
	}
	return r;
}
int n;
ll calc(int a,int b,string sa,string sb)
{
	int td=0,ta=0;
	for(int i=0;i<n;i++)
	{
		int fa=sa[i]-'0',fb=sb[i]-'0';
		if(fb>=1) fa=1-fa,fb=1-fb;
		if(fa) ta++;
		else td++;
	}
	for(int i=0;i<=ta;i++) fa[i]=C(ta,i);
	for(int i=0;i<=td;i++) fd[i]=C(td,i);
	for(int i=1;i<=td;i++) fd[i]=(fd[i-1]+fd[i])%m;
	ll rt=0;
	for(int i=0;i<=ta;i++)
	{
		int g=min(a-ta+i,b-i);
		if(g<0) continue;
		rt+=fa[i]*fd[g]%m;
	}
	return rt%m;
}
int main()
{
	jc[0]=1;
	for(int i=1;i<=10000;i++) jc[i]=jc[i-1]*i%m;
	jy[10000]=pw(jc[10000]);
	for(int i=9999;i>=0;i--) jy[i]=jy[i+1]*(i+1)%m;
	ios_base::sync_with_stdio(0);
	cin>>n;
	int a,b,c;
	string sa,sb,sc;
	cin>>a>>sa>>b>>sb>>c>>sc;
	ll ans=0;
	for(int i=0;i<=a;i++) ans+=C(n,i);
	for(int i=0;i<=b;i++) ans+=C(n,i);
	for(int i=0;i<=c;i++) ans+=C(n,i);
	int td=0,ta=0,tb=0,tc=0;
	for(int i=0;i<n;i++)
	{
		int fa=sa[i]-'0',fb=sb[i]-'0',fc=sc[i]-'0';
		if(fa+fb+fc>=2) fa=1-fa,fb=1-fb,fc=1-fc;
		if(fa) ta++;
		else if(fb) tb++;
		else if(fc) tc++;
		else td++;
	}
	for(int i=0;i<=ta;i++) fa[i]=C(ta,i);
	for(int i=0;i<=tb;i++) fb[i]=C(tb,i);
	for(int i=0;i<=tc;i++) fc[i]=C(tc,i);
	for(int i=0;i<=td;i++) fd[i]=C(td,i);
	for(int i=0;i<=tc;i++) for(int j=0;j<=td;j++)
	{
		pf[n+j-i][i+j]=fc[i]*fd[j]%m;
	}
	for(int i=1;i<=n*2;i++) for(int j=0;j<=n;j++) pf[i][j]=(pf[i][j]+pf[i-1][j])%m;
	for(int i=0;i<=n*2;i++) for(int j=1;j<=n;j++) pf[i][j]=(pf[i][j]+pf[i][j-1])%m;
	for(int i=0;i<=ta;i++) for(int j=0;j<=tb;j++)
	{
		int ab=min(a-ta+i-j,b-tb+j-i),gc=c-tc-i-j+n;
		if(ab<0||gc<0) continue;
		ans+=fa[i]*fb[j]%m*pf[ab][gc]%m;
	}
	ans+=m-calc(a,b,sa,sb);
	ans+=m-calc(b,c,sb,sc);
	ans+=m-calc(c,a,sc,sa);
	cout<<ans%m<<endl;
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3724kb

input:

3
1 000
1 100
0 111

output:

7

result:

ok answer is '7'

Test #2:

score: 0
Accepted
time: 1ms
memory: 6100kb

input:

5
2 10110
0 11010
1 00000

output:

19

result:

ok answer is '19'

Test #3:

score: 0
Accepted
time: 1ms
memory: 6076kb

input:

3
2 011
0 100
3 010

output:

8

result:

ok answer is '8'

Test #4:

score: -100
Wrong Answer
time: 1ms
memory: 4080kb

input:

5
1 11010
3 00001
4 01011

output:

28

result:

wrong answer expected '32', found '28'