A
0-9和为45,一个一个减去得到的就是少的那个
#include<iostream>
using namespace std;
int main(){
int ans=45,t=9;
while(t--)ans-=getchar()-48;
cout<<ans;
}
B
翻倍,使用for模拟,要用long long
#include<iostream>
using namespace std;
int main(){
long long a,b,c,ans=0;
cin>>a>>b>>c;
for(long long i=a;i<b;i*=c)ans++;
cout<<ans;
}
C
长度为N<=50的数列,
其中每个数字1<=A[i]<=M<=50
,
且这N个数之和小于K,
问:有多少符合条件(%998244353)
明显,5050的规模 暴力模拟(递归)是不行的。
这个数据量应该是dp。 (最好还是不要经验主义)
定义dp: dp[i,j]
长度为i的数列 总和为 j
的数量。
初始化 dp[0,0]=1
(前0项和为0的数量为1)
dp转移:如果当前dp[i,j]
还符合条件,dp[i+1,j+1]+=dp[i,j]
。
即if(i<=N&&j<=K)dp[i+1][j+1]+=dp[i][j];
dp结果:dp[N,1] + dp[N,2] + …… + dp[N,K]
。
长度为N的加在一起即为答案,记得取模。
dp转移有点难懂,看看代码吧
#include<iostream>
using namespace std;
int n,m,k,mod = 998244353,dp[53][2553],ans;
int main(){
cin>>n>>m>>k;//k<=n*m
for(int i=1;i<=m;i++)dp[1][i]=1;//一个数时和为i的各有一个
for(int i=1;i<n;i++)
for(int j=1;j<k;j++)
for(int add=1;add<=m;add++)
dp[i+1][j+add]=(dp[i+1][j+add]+dp[i][j])%mod;
for(int i=0;i<=k;i++)ans=(ans+dp[n][i])%mod;
cout<<ans;
}
D
存下来每个数字的坐标,二分查找,stl贼好用。
不会的去研究一下stl。
#include <bits/stdc++.h>
using namespace std;
int l, r, x,n;
vector<vector<int> >idx(n + 1);
int main() {
cin >> n;
for(int i = 0,a; i < n; i++) {
cin >> a; idx[a].push_back(i);
}
cin>>x;
while(cin >> l >> r >> x) {
cout << lower_bound(idx[x].begin(), idx[x].end(), r) - lower_bound(idx[x].begin(), idx[x].end(), l - 1) << endl;
}
}
E
挖了个大坑,以后补