第一题
每一个数字后面接1-7的任意一位数都是可以的所以可以考虑直接对每一个数后面直接加0-9 就一定会有答案
证明: 首先我们在最后面加数也就是直接变成原来的10倍,每7个数都会有一个是7的倍数那么对现在这个数便利10个数一定会有是7的倍数出现不过我们一定要看数据这样写是会爆(long long)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int t,n,m;
bool check(string res){
LL ans=0;
for(auto&v:res) ans=ans*10+v-'0';
return ans%7==0;
}
void solve()
{
cin>>n;
string s=to_string(n);
m=s.size();
for(int i=0;i<=9;i++){
string ans=s;
ans+=(i+'0');
if(check(ans)){
cout<<ans<<endl;
return ;
}
}
return ;
}
signed main ()
{
solve();
}
第二题
数据范围不是很大题目意思十分简单我们直接枚举所有的变化就好了
考虑到首尾的a,z连接到一起那么就有abs(a[i]-i) 和26-abs(a[i]-i) 也就是两种最快的逼近方式
#include <bits/stdc++.h>
using namespace std;
const int N=1000010;
int t,n,m;
char s[N];
void solve()
{
cin>>s+1;
n=strlen(s+1);
int res=26*n;
for(int i='a';i<='z';i++){
int ans=0;
for(int j=1;j<=n;j++){
ans+=min(abs(s[j]-i),26-abs(s[j]-i));
}
res=min(res,ans);
}
cout<<res<<endl;
return ;
}
signed main ()
{
solve();
}
我们直接枚举一种礼包的数量所有的情况即可然后对剩下的直接计算另一个的数量即可
// 数学公式要变形
// 莫急莫急先读题
#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x&(-x))
#define int long long
map<int,int> mp;
int t,n,m,a,b;
void solve()
{
cin>>n>>m>>a>>b;
int num=min(n/2,m);
int ans=0;
for(int i=0;i<=num;i++){
int res=i*a;
res+=min(n-2*i,m-i>>1)*b;
ans=max(ans,res);
}
cout<<ans<<endl;
return ;
}
signed main ()
{
solve();
}
第四题
我们可以明显发现只要最大的越里面总和就越大
那么我们可以试着模拟一下四个角落的数每个数都只会加2次,其他边上的数都会加3次里面的数都是4次就好了
对于里面的数计算出个数就是用等差数列就好了,详情见代码
注意中间的取模操作mod
// 数学公式要变形
// 莫急莫急先读题
#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
#define int long long
int t,n,m;
void solve()
{
cin>>n;
int ans=3*(4*n-4+1)%mod*(2*n-2)-10;
ans%=mod;
ans=(ans+mod)%mod;
int num=(n*n+4-4*n)%mod;//
ans=(ans+num%mod*2%mod*(2*n*n%mod-num+1)%mod)%mod;
ans=(ans+mod)%mod;
cout<<ans<<endl;
return ;
}
signed main ()
{
solve();
}