QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#409549#3771. Spanning TreeszhouhuanyiAC ✓14ms5560kbC++14946b2024-05-12 11:07:152024-05-12 11:07:17

Judging History

This is the latest submission verdict.

  • [2024-05-12 11:07:17]
  • Judged
  • Verdict: AC
  • Time: 14ms
  • Memory: 5560kb
  • [2024-05-12 11:07:15]
  • Submitted

answer

#include<iostream>
#include<cstdio>
#define N 100001
#define mod 1000000007
using namespace std;
int read()
{
	char c=0;
	int sum=0;
	while (c<'0'||c>'9') c=getchar();
	while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
	return sum;
}
void Adder(int &x,int d)
{
	x+=d;
	if (x>=mod) x-=mod;
	return;
}
void Adder2(int &x,int d)
{
	x+=d;
	if (x<0) x+=mod;
	return;
}
int n,delta[N+1],s[N+1],dp[N+1][2];
char c[N+1];
int main()
{
	while (cin>>n)
	{
		for (int i=1;i<=n;++i) cin>>c[i];
		s[n+1]=0;
		for (int i=n;i>=1;--i) s[i]=s[i+1]+c[i]-'0';
		for (int i=1;i<=n-1;++i)
		{
			if (c[i]=='1') delta[i]=i+s[i+1];
			else delta[i]=s[i+1];
		}
		dp[0][0]=dp[0][1]=1;
		for (int i=1;i<=n-1;++i)
		{
			for (int op=0;op<=1;++op) dp[i][op]=1ll*dp[i-1][op]*delta[i]%mod;
			if (c[i]=='1') Adder2(dp[i][1],-dp[i-1][0]);
			else Adder(dp[i][0],dp[i-1][1]);
		}
		printf("%d\n",dp[n-1][1]);
	}
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 14ms
memory: 5560kb

input:

3
001
4
0101
5
11111
2
11
2
11
2
11
2
01
2
11
2
01
2
11
2
11
3
111
3
111
3
001
3
011
3
111
3
011
3
011
3
101
3
101
3
011
3
011
3
111
3
001
3
111
3
111
3
111
4
0011
4
1101
4
0111
4
0001
4
1111
4
1111
4
0111
4
0001
4
0101
4
0011
4
1101
4
1011
4
0101
4
0011
4
0101
4
1101
4
1011
4
0011
4
1111
4
0111
4
1...

output:

1
3
125
1
1
1
1
1
1
1
1
3
3
1
3
3
3
3
1
1
3
3
3
1
3
3
3
8
3
16
1
16
16
16
1
3
8
3
8
3
8
3
3
8
8
16
16
1
8
3
3
8
8
8
16
3
1
3
16
75
20
20
3
8
40
20
16
20
16
40
40
3
125
40
20
3
125
20
125
125
75
16
75
8
1
1
8
8
16
125
8
1
40
125
40
20
3
3
16
20
75
3
125
125
1
8
125
8
16
16
125
8
20
3
1
125
8
1
75
1
2...

result:

ok 5202 lines