A.Hate Non-integer Number
- 传统题 1000ms 256MiB
题面翻译
已知一个长度为 NN 的数列 a1,a2,⋯aNa1,a2,⋯aN,从数列中选出至少一个数,使选出的数平均数为整数,求有多少种这样的方案,对 998244353998244353 取模。
样例 #1
样例输入 #1
3
2 6 2
样例输出 #1
6
样例 #2
样例输入 #2
5
5 5 5 5 5
样例输出 #2
31
提示
制約
- 1 ≤ N ≤ 1001 ≤ N ≤ 100
- 1 ≤ ai ≤ 1091 ≤ ai ≤ 109
DP(五星难度(哭))
和上篇2023.8.3_moonsea is coding的博客-CSDN博客的B题十分滴类似嘞
但要多记录一个状态:累加的数字
状态表示:f[i][j][k]:运行到第i层,选k个数,之和%cnt为j的情况数
#include<bits/stdc++.h>
using namespace std;
int n,f[105][105][105],ans,num[105];
const int MOD=998244353;
void upd(int &a,int b)
{
a=(a+b)%MOD;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
for(int cnt=1;cnt<=n;cnt++)
{
memset(f,0,sizeof(f));
f[0][0][0]=1;
for(int i=0;i<=n-1;i++)
for(int j=0;j<=cnt-1;j++)
for(int k=0;k<=min(cnt,i);k++)
{
upd(f[i+1][j][k],f[i][j][k]);
if(k<cnt)
upd(f[i+1][(j+num[i+1])%cnt][k+1],f[i][j][k]);
}
upd(ans,f[n][0][cnt]);
}
printf("%d",ans);
return 0;
}
B.最长合法括号序列
- 传统题 1000ms 256MiB
Description
如果一个括号序列插入"+"和"1"后,可以得到一个正确的数学表达式,那么它被称为"合法"的。
例如,序列"(())()","()"和"(()(()))"是合法的,但")(","(()"和"(()))("不是合法的。
给出一个由"("和")"字符组成的字符串。
你要找出它最长的是合法括号序列的子串,也同样要找出最长子串的个数。
当不存在合法括号序列时,请输出 "0 1" 。
Format
Input
给出一个字符串,字符串长度小于等于10^6
Output
如题
Samples
输入数据 1
)()()(
输出数据 1
4 1
DP+栈
复习一下,栈的性质:后进先出
f[i]:从1-i,一定包括i,最长合法括号序列
#include<bits/stdc++.h>
using namespace std;
int st[1000005],f[1000005],len,top,j,ans,cnt;
string s;
int main()
{
cin>>s;
len=s.length();
for(int i=1;i<=len;i++)
{
if(s[i-1]==')')
if(top)
{
j=st[top--];
f[i]=f[j-1]+i-j+1;
}
else
st[++top]=i;
}
for(int i=1;i<=len;i++)
ans=max(ans,f[i]);
for(int i=1;i<=len;i++)
if(f[i]==ans)
cnt++;
if(ans==0)
cnt=1;
printf("%d %d",ans,cnt);
return 0;
}