题意
题解
代码
#include
using namespace std;
void solve() {
int n,a[15]; cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
if(a[0]==1) cout<<"Yes"<<'\n';
else cout<<"No"<<'\n';
}
int main() {
int t=1; cin>>t;
while(t--) solve();
return 0;
}
题意
给定一个长度为n的01串,对于任意一个子串的价值计算如下
v
a
l
u
e
=
{
c
n
t
0
×
c
n
t
1
,
(
c
n
t
0
!
=
0
,
c
n
t
1
!
=
0
)
c
n
t
0
×
c
n
t
0
,
(
c
n
t
0
!
=
0
,
c
n
t
1
=
0
)
c
n
t
1
×
c
n
t
1
,
(
c
n
t
0
=
0
,
c
n
t
1
!
=
0
)
value= \begin{cases} cnt_0\times cnt_1,&(cnt_0!=0,cnt_1!=0)\\ cnt_0\times cnt_0,&(cnt_0!=0,cnt_1=0)\\ cnt_1\times cnt_1,&(cnt_0=0,cnt_1!=0)\\ \end{cases}
value=⎩
⎨
⎧cnt0×cnt1,cnt0×cnt0,cnt1×cnt1,(cnt0!=0,cnt1!=0)(cnt0!=0,cnt1=0)(cnt0=0,cnt1!=0)
问所有子串价值的最大值为多少
题解
代码
#include
using namespace std;
const int N=1e5+10;
int a[N];
void solve() {
int n; long long res=0; cin>>n;
string s; cin>>s;
int ma=0,maa=0,cnt1=0,cnt0=0;
int temp=0;
for(auto i:s) {
if(i=='1') {
cnt1++;
temp++;
ma=max(ma,temp);
}
else {temp=0;cnt0++;}
}
temp=0;
for(auto i:s) {
if(i=='0') {
temp++;
maa=max(maa,temp);
}
else temp=0;
}
if(1ll*ma*ma>1ll*maa*maa) res=1ll*ma*ma;
else res=1ll*maa*maa;
if(1ll*cnt0*cnt1>res) res=1ll*cnt0*cnt1;
cout<<res<<'\n';
}
int main() {
int t=1; cin>>t;
while(t--) solve();
return 0;
}
题意
题解
代码
#include
#include
using namespace std;
typedef pair<int,int> PII;
void solve() {
int n; cin>>n;
string a,b; cin>>a>>b;
if(a!=b) {//不完全相反
bool f=1;
for(int i=0;i<n;i++)
if(a[i]==b[i]) { f=0; break; }
if(!f) {cout<<"NO"<<'\n'; return ;}
}
cout<<"YES"<<'\n';
vector<PII> A;
for(int i=1;i<=n;i++) {
if(a[i-1]=='1') {
A.push_back({i,i});
if(i>1) b[0]=(b[0]=='1' ? '0':'1');
}
}
if(b[0]=='1') { A.push_back({1,n}); A.push_back({1,1}); A.push_back({2,n});}
cout<<A.size()<<'\n';
for(auto x:A) cout<<x.first<<' '<<x.second<<'\n';
}
int main() {
int t=1; cin>>t;
while(t--) solve();
return 0;
}
题意
题解
代码
#include
#include
using namespace std;
const int N=2e5+10,mod=998244353;
typedef long long ll;
int n,m,a[N];
int num,sum;
vector<int> primes;
void prime(int x) {//分解质因数
primes.clear();
for(int i=2;i*i<=x;i++)
if(x%i==0) {
primes.push_back(i);
while(x%i==0) x/=i;
}
if(x>1) primes.push_back(x);
}
void dfs(int pos,int mul,int len) {//搜索枚举每一种质因数的选取情况,用容斥原理计算数量
if(pos==primes.size()) {
if(len) {
if(len%2) sum+=num/mul;
else sum-=num/mul;
}
return ;
}
dfs(pos+1,mul,len);
dfs(pos+1,mul*primes[pos],len+1);
}
int cal(int l,int k) {//计算[1,L]中与k互质的数量
prime(k);
num=l,sum=0;
dfs(0,1,0);
return l-sum;
}
int solve() {
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2;i<=n;i++)//a数组不合法
if(a[i-1]%a[i]) return 0;
ll res=1;
for(int i=2;i<=n;i++) {
if(a[i]==a[i-1]) res=res*(m/a[i])%mod;//降低复杂度
else res=res*cal(m/a[i],a[i-1]/a[i])%mod;//计算每一个位置的合法数量
}
return res;
}
int main() {
int t; cin>>t;
while(t--) cout<<solve()<<'\n';
return 0;
}