E
数据范围很小,两重for循环可解。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
#define pii pair<int,int>
const int mod=998244353;
void solve(){
int r,g,b,n;
cin>>r>>g>>b>>n;
int sum=0;
for(int i=0;i<=3000;i++){
for(int j=0;j+i<=3000;j++){
int z=n-i*r-j*g;
if(z%b==0 and z>=0){
sum++;
}
}
}
cout<<sum<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int oyyo=1;
//cin>>oyyo;
while(oyyo--) {
solve();
}
return 0;
}
D
数据范围i依然很小,只有3个数,遍历前两个数,只计算第三个数,看情况是否符合就好。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
#define pii pair<int,int>
const int mod=998244353;
void solve(){
int N;
cin>>N;
int d1,d2,d3;
int zz=0;
for(int h=1;h<=3500;h++){
for(int n=1;n<=3500;n++){
int z1=N*n*h;
int z2=4*h*n-N*n-N*h;
if(z1>0 and z2>0 and z1%z2==0){
d1=h,d2=n,d3=z1/z2;
if(d1<=3500 and d2<=3500 and d3<=3500){
zz=1;
break;
}
}
}
if(zz==1){
break;
}
}
cout<<d1<<" "<<d2<<" "<<d3<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int oyyo=1;
//cin>>oyyo;
while(oyyo--) {
solve();
}
return 0;
}
F
会有两个结果:①内部自己就有AB②将边界相连产生新的AB。
②情况是——A,B——
贴个错误的代码:
代码逻辑是,如果在字符串内部出现AB,那么直接相加,因为这个和”将边界相连“这一步骤不会产生冲突,然后将每个字符串的边界情况进行区分,N1个B-A,N2个--A,N3个B--,第一个自身就可以两两配对产生新的AB,有(N1-1)个,然后两个边界去贴一个--A和B--(如果有的话)之后就只能--A和B--配对。这个做法会有两个点报WA。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
#define pii pair<int,int>
const int mod=998244353;
void solve(){
int n;
cin>>n;
vector<string>s(n);
for(int i=0;i<n;i++){
cin>>s[i];
}
int sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<s[i].size()-1;j++){
if(s[i][j]=='A' and s[i][j+1]=='B'){
sum++;
}
}
}
int k1=0,k2=0,k0=0;
for(int i=0;i<n;i++){
if(s[i][0]=='B' and s[i][s[i].size()-1]!='A'){
k2++;
continue;
}if(s[i][s[i].size()-1]=='A' and s[i][0]!='B'){
k1++;
continue;
}if(s[i][s[i].size()-1]=='A' and s[i][0]=='B'){
k0++;
continue;
}
}
sum+=k0-1;
if(k1>0){
sum++;
k1--;
}
if(k2>0){
sum++;
k2--;
}
int min1=min(k1,k2);
sum+=min1;
if(sum==-1){
sum=0;
}
cout<<sum<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int oyyo=1;
//cin>>oyyo;
while(oyyo--) {
solve();
}
return 0;
}
原因在这里,当K0等于0时,接下来的两个if语句就是完全错的。当K0为0时,sum+min(k1,k2)就好。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
#define pii pair<int,int>
const int mod=998244353;
void solve(){
int n;
cin>>n;
vector<string>s(n);
for(int i=0;i<n;i++){
cin>>s[i];
}
int sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<s[i].size()-1;j++){
if(s[i][j]=='A' and s[i][j+1]=='B'){
sum++;
}
}
}
int k1=0,k2=0,k0=0;
for(int i=0;i<n;i++){
if(s[i][0]=='B' and s[i][s[i].size()-1]!='A'){
k2++;
continue;
}if(s[i][s[i].size()-1]=='A' and s[i][0]!='B'){
k1++;
continue;
}if(s[i][s[i].size()-1]=='A' and s[i][0]=='B'){
k0++;
continue;
}
}
if(k0!=0){
sum+=k0-1;
if(k1>0){
sum++;
k1--;
}
if(k2>0){
sum++;
k2--;
}
int min1=min(k1,k2);
sum+=min1;
if(sum==-1){
sum=0;
}
cout<<sum<<endl;
}else{
sum+=min(k1,k2);
cout<<sum<<endl;
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int oyyo=1;
//cin>>oyyo;
while(oyyo--) {
solve();
}
return 0;
}
G
打表瞪眼法,首先就这个公式 可以看出当m小于sqrt(N)时,情况一定不符合,因为N/m一定大于等于m,而N mod m又一定小于m。然后通过打表可以发现,如果一个数是N的因数,而这个因数-1又不是因数的时候,那么这个因数-1就是答案,要加进最后sum里面。
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
#define endl '\n'
#define inf 0x3f3f3f3f
#define pii pair<int,int>
const int mod=998244353;
void solve(){
int n;
cin>>n;
if(n==2){
cout<<"0"<<endl;
return;
}
int sum=0;
int nn=sqrt(n);
map<int,int>u;
for(int i=1;i*i<=n;i++){
if(n%i==0){
u[i]++;
u[n/i]++;
}
}
for(auto&c:u){
if(c.first>nn and u[c.first-1]==0){
sum+=c.first-1;
}
}
cout<<sum<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int oyyo=1;
//cin>>oyyo;
while(oyyo--) {
solve();
}
return 0;
}