QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#409549 | #3771. Spanning Trees | zhouhuanyi | AC ✓ | 14ms | 5560kb | C++14 | 946b | 2024-05-12 11:07:15 | 2024-05-12 11:07:17 |
Judging History
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