A:
题意:输入A,B,C,请输出A-B之间C的倍数(任意一个)
代码如下
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(void)
{
ll a,b,c;
cin>>a>>b>>c;
ll k=c;
for(k;k<=b;k+=c)
{
if(a<=k&&k<=b)
{
cout<<k<<endl;
return 0;
}
}
cout<<-1<<endl;
}
B
进制转化题,把两个数先转化为十进制,相加输出答案即可
代码如下
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
using namespace std;
typedef long long ll;
int main(void)
{
ios::sync_with_stdio(false);
int k;
cin>>k;
string a,b;
cin>>a>>b;
string an="",bn="";
for(int i=a.size()-1;i>=0;i--)
an+=a[i];
for(int i=b.size()-1;i>=0;i--)
bn+=b[i];
ll sum1=0,sum2=0,sum;
for(int i=0;i<an.size();i++)
{
sum1+=(ll)pow(k,i)*(an[i]-'0');
}
for(int i=0;i<bn.size();i++)
{
sum2+=(ll)pow(k,i)*(bn[i]-'0');
}
cout<<sum1*sum2<<endl;
}
C
输入一个N,一个大小为N的数组,一个X,请问加到多少次和大于X,当数组用完了从头再来一次。
思路,把数组的和求出来,然后看第几次和大于X,这样就不会超时了。代码如下
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
using namespace std;
typedef long long ll;
int a[100005];
int main(void)
{
ios::sync_with_stdio(false);
int n;
cin>>n;
ll sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
}
ll x;
cin>>x;
ll ans=(x/sum)*n;
ll rest=x%sum;
for(int i=0;i<n;i++)
{
if(rest<0)
break;
rest-=a[i];
ans++;
}
cout<<ans;
}
D
两个操作,把前两个数相加对十求余,加到集合前面,
或者相乘对十求余,加到前面,最后变成一个数。
问每个数有多少种可能?
思路,线性dp,每次加上前一次的即可
代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
using namespace std;
typedef long long ll;
int a[100005];
int dp[100005][10];
const int N=998244353;
int n;
int main(void)
{
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
dp[1][a[1]]=1;
for(int i=1;i<=n-1;i++)
{
for(int j=0;j<=9;j++)
{
dp[i+1][(j+a[i+1])%10]=(dp[i][j]+dp[i+1][(j+a[i+1])%10])%N;
dp[i+1][(j*a[i+1])%10]=(dp[i][j]+dp[i+1][(j*a[i+1])%10])%N;
}
}
for(int i=0;i<=9;i++)
{
cout<<dp[n][i]<<endl;
}
}
F:
我不会写,我也看不太懂,贴一下大佬的答案吧