C
n=100 m=3
把n以内 所有3的倍数 的数个位求和
找周期
ll n,m,k,q,t,sum1,sum2,num,ans=INF,cnt;
ll a[maxn],vis[maxn],res;
vector<int> v[maxn];
int main(){
cin>>q;
while(q--){
cin>>n>>m;
sum1=0,sum2=0,res=0;
num=m;
while(num%10){
sum1+=num%10; //1个周期的和
num+=m;
}
t=n/num; // 100/30=3轮 到90
res=n%num; //还剩10
sum2+=sum1*t;
num=0;
num=m;
while(num<=res){
sum2+=num%10;
num+=m;
}
cout<<sum2<<endl;
}
return 0;
}
D2
使k个相同的最小次数
n,k<=2e5
n=4 k=3
1 2 2 4 5
1
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define pb push_back
#define mp make_pair
#define IO ios::sync_with_stdio(false)
#define fi first
#define se second
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=2e5+5;
const int maxm=1e6+5;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
ll n,m,k,sum1,num,cnt1,ans=INF,cnt2,cnt;
ll a[maxn],vis[maxn],ave;
vector<int> v[maxn];
int main(){
cin>>n>>k;
rep(i,1,n){
cin>>a[i];
cnt=0;
while(a[i]){
v[a[i]].pb(cnt);
cnt++;
a[i]/=2;
}
v[0].pb(cnt);
}
for(int i=0;i<=2e5;i++){
if(v[i].size()<k)
continue;
num=0;
sort(v[i].begin(),v[i].end());
for(int j=0;j<k;j++){
num+=v[i][j];
}
ans=min(ans,num);
}
cout<<ans<<endl;
return 0;
}
E
字符串包含n个a,n个b,n个c
长度为2 的字符串s和t
构造结果只有12种 满足不包含子串s/t
next_permutation()函数 返回bool值 找不到下一个排列 false
string(n,jwj[0]) 把字符复制n次 构成字符串
ll n,m,k,q,sum1,sum2,num,cnt;
ll a[maxn],vis[maxn];
vector<string> ans;
string s,t;
int main(){
cin>>n;
cin>>s>>t;
cout<<"YES"<<endl;
string jwj="abc";
do{
string tmp="";
for(int i=0;i<n;i++)
tmp+=jwj;
ans.pb(tmp);
ans.pb(string(n,jwj[0])+string(n,jwj[1])+string(n,jwj[2]));
}while( next_permutation( jwj.begin(),jwj.end() ) ); //循环6次 构造12个 每个都包含n个a/b/c
for(auto k:ans){
if(k.find(s)==string::npos && k.find(t)==string::npos) //k找不到s和t的子串
{
cout<<k<<endl;
return 0;
}
}
return 0;
}