题目链接:https://codeforces.com/contest/1326
A 输出5…3即可,一定不会整除5和3
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010,inf=0x3f3f3f3f;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
if(n==1) cout<<"-1"<<endl;
else
{
cout<<5;
for(int i=1;i<n;i++)
cout<<3;
puts("");
}
}
return 0;
}
B 令a1=b1依次向后推即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
const ll inf=0x3f3f3f3f3f3f3f3f;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
ll a[N],b[N];
int main()
{
int t,n;
ll mn=-inf;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],b[i]=b[i-1]+a[i];
cout<<a[1]<<' ';
mn=a[1];
for(int i=2;i<=n;i++)
{
cout<<a[i]+mn<<' ';
if(a[i]>0) mn=a[i]+mn;
}
return 0;
}
C 长度为n的数组被划分为k个区间,使k个区间的最大值的和最大,问最大的和和这样划分的方案数。
最大的和一定是最大的k个数的和,找到这k个数所在的位置再求方案数,假定这k个数的位置是 l1,l2…lk。
k个区间共需要k-1个隔板,下面看各个隔板的位置,第一个区间要包含l1不超过l2,第一个隔板有(l2-l1)种放法,那么类比第二个有(l3-l2)种放法…
所以答案就出来了,和并不用取模…
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010,mod=998244353;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,k,a[N];
pair<int,int> b[N];
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i],b[i]={a[i],i};
sort(b+1,b+n+1);
vector<int> st;
ll sum=0,cnt=1;
for(int i=n;n-i<k;i--) st.push_back(b[i].second),sum+=b[i].first;
sort(st.begin(),st.end());
for(int i=1;i<st.size();i++) cnt=cnt*(st[i]-st[i-1])%mod;
cout<<sum<<' '<<cnt%mod;
return 0;
}
D 已知字符串s,将s的前缀和后缀拼接,输出所得的字符串是回文串的且长度最大的串
首先找s的最大首尾逆序的长度,那么除了这两部分剩下的串中分别找首尾最长的回文串,选择两个中长度大的哪一个再与首位逆序的两部分拼接就可以,D2的数据范围比较大就需要快速的判断回文串 哈希就可以了(选择合适的质数,被卡了好几个…)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2000010,mod=1e9+7;
typedef unsigned long long ull;
const ll p=233;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,t,k;
string s;
ll po[N];
void init()
{
po[0]=1;
for(int i=1;i<N;i++)
po[i]=po[i-1]*p%mod;
return ;
}
int main()
{
init();
cin>>t;
while(t--)
{
cin>>s;
int l=-1,len1,len2;
for(int i=0;i<s.size();i++)
if(s[i]!=s[s.size()-1-i])
{
l=i-1;
break;
}
len1=l;
ll res1=0,res2=0;
for(int i=l+1;i<s.size()-l-1;i++)
{
res1=(res1+po[i-l-1]*(s[i]-'a')%mod)%mod;
res2=(res2*p+s[i]-'a')%mod;
if(res1==res2) len1=i;
}
len2=s.size()-l-1;
res1=res2=0;
for(int i=s.size()-l-2;i>l;i--)
{
res1=(res1+po[s.size()-l-1-i-1]*(s[i]-'a')%mod)%mod;
res2=(res2*p+s[i]-'a')%mod;
if(res1==res2) len2=i;
}
for(int i=0;i<=l;i++) cout<<s[i];
if(len1-l>=s.size()-l-1-len2) for(int i=l+1;i<=len1;i++) cout<<s[i];
else for(int i=len2;i<s.size()-l-1;i++) cout<<s[i];
for(int i=s.size()-l-1;i<s.size();i++) cout<<s[i];
puts("");
}
return 0;
}