北京化工大学 2022-2023-1 ACM集训队每周程序设计竞赛(7)题解
问题 A: 幸运数字
思路:直接把N当成字符串读入,循环判断是否有一位是7就可以了。
#include <bits/stdc++.h>//#include<iostream>//#include<string.h>//#include<math.h//#include<algorithm>
#define ll long long
#define db double
#define pii pair<int,int>
#define cf int _;cin>>_;while(_--)
#define de cout<<"---"<<endl;
#define mem(x,v) memset(x,v,sizeof(x))
#define L(x) x&(-x)
#define pb push_back//emplace_back//priority_queue <int,vector<int>,greater<int> > q;
#define INF 0x3f3f3f3f
#define endl '\n'
//function<void(int)> dfs = [&](int u);
//#define x first
//#define y second
using namespace std;
const int mod=998244353;
int n;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);string a;bool ok=0;cin>>a;for(auto i:a){if(i=='7')ok=1;}cout<<(ok?"Yes":"No")<<endl;
}
问题 B: 幸运数字2
思路:直接暴力从1到N判断是不是幸运数字,如果是答案就加上它。
#include <bits/stdc++.h>//#include<iostream>//#include<string.h>//#include<math.h//#include<algorithm>
#define ll long long
#define db double
#define pii pair<int,int>
#define cf int _;cin>>_;while(_--)
#define de cout<<"---"<<endl;
#define mem(x,v) memset(x,v,sizeof(x))
#define L(x) x&(-x)
#define pb push_back//emplace_back//priority_queue <int,vector<int>,greater<int> > q;
#define INF 0x3f3f3f3f
#define endl '\n'
//function<void(int)> dfs = [&](int u);
//#define x first
//#define y second
using namespace std;
const int mod=998244353;
int n;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;ll res=0;for(int i=1;i<=n;i++){if(i%3&&i%5)res+=i;}cout<<res<<endl;
}
问题 C: gcd问题
思路:直接K三方+辗转相除法暴力求解就行。
#include <bits/stdc++.h>//#include<iostream>//#include<string.h>//#include<math.h//#include<algorithm>
#define ll long long
#define db double
#define pii pair<int,int>
#define cf int _;cin>>_;while(_--)
#define de cout<<"---"<<endl;
#define mem(x,v) memset(x,v,sizeof(x))
#define L(x) x&(-x)
#define pb push_back//emplace_back//priority_queue <int,vector<int>,greater<int> > q;
#define INF 0x3f3f3f3f
#define endl '\n'
//function<void(int)> dfs = [&](int u);
//#define x first
//#define y second
using namespace std;
const int mod=998244353;
int n;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;ll res=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){int t=gcd(i,j);for(int k=1;k<=n;k++){res+=gcd(t,k);}}}cout<<res<<endl;
}
问题 D: RGB
思路:先求出满足条件1的所有答案,就是R的个数×G的个数×B的个数,然后枚举i和j,得出不满足条件2的k,然后判断i,j,k是否满足条件1,如果满足则把它从答案中减去。
#include <bits/stdc++.h>//#include<iostream>//#include<string.h>//#include<math.h//#include<algorithm>
#define ll long long
#define db double
#define pii pair<int,int>
#define cf int _;cin>>_;while(_--)
#define de cout<<"---"<<endl;
#define mem(x,v) memset(x,v,sizeof(x))
#define L(x) x&(-x)
#define pb push_back//emplace_back//priority_queue <int,vector<int>,greater<int> > q;
#define INF 0x3f3f3f3f
#define endl '\n'
//function<void(int)> dfs = [&](int u);
//#define x first
//#define y second
using namespace std;
const int mod=998244353;
int n;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;string a;cin>>a;ll r=0,g=0,b=0;for(int i=0;i<n;i++){if(a[i]=='R')r++;else if(a[i]=='G')g++;else b++;}ll res=r*b*g;for(int i=0;i<n;i++){for(int j=1;;j++){int ii=i+j,jj=ii+j;if(jj>=n)break;if(a[i]!=a[ii]&&a[i]!=a[jj]&&a[ii]!=a[jj])res--;}}cout<<res<<endl;
}
问题 E: gcd问题2
思路:设f[i]等于gcd(a1,a2,...,an)=i的a数组的个数,那么k中可以被i整除的数的个数有k/i,但是f[i]不等于k/i的n次方,因为其中还包含gcd(a1,a2,...,an)=i的倍数的a数组,所以要减去f[j](j=i的倍数,最后f[i]*i求和即可得到答案。
#include <bits/stdc++.h>//#include<iostream>//#include<string.h>//#include<math.h//#include<algorithm>
#define ll long long
#define db double
#define pii pair<int,int>
#define cf int _;cin>>_;while(_--)
#define de cout<<"---"<<endl;
#define mem(x,v) memset(x,v,sizeof(x))
#define L(x) x&(-x)
#define pb push_back//emplace_back//priority_queue <int,vector<int>,greater<int> > q;
#define INF 0x3f3f3f3f
#define endl '\n'
//function<void(int)> dfs = [&](int u);
//#define x first
//#define y second
using namespace std;
const int mod=1e9+7;
int n,k;
ll f[100005];
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>k;for(int i=k;i>=1;i--){f[i]=powmod(k/i,n);for(int j=i*2;j<=k;j+=i){f[i]-=f[j];if(f[i]<0)f[i]+=mod;}}ll res=0;for(int i=1;i<=k;i++){res+=i*f[i]%mod;res%=mod;}cout<<res<<endl;
}
问题 F: 付哥拿糖果
思路:设f[i][j][k]为从i开始跳跳到j其中多跳了k个的最大答案(默认每次取相中间差一个的糖果,如果中间差两个那么多跳了1个),那么当n是奇数时答案就取dp[1][n][3],dp[1][n-1][2],dp[1][n-2][1],dp[2][n][2],dp[2][n-1][1],dp[3][n][1]中的最大值,是偶数时答案就取dp[1][n][2],dp[1][n-1][1],dp[2][n][1]中的最大值。
#include <bits/stdc++.h>//#include<iostream>//#include<string.h>//#include<math.h//#include<algorithm>
#define ll long long
#define db double
#define pii pair<int,int>
#define cf int _;cin>>_;while(_--)
#define de cout<<"---"<<endl;
#define mem(x,v) memset(x,v,sizeof(x))
#define L(x) x&(-x)
#define pb push_back//emplace_back//priority_queue <int,vector<int>,greater<int> > q;
#define INF 0x3f3f3f3f
#define endl '\n'
//function<void(int)> dfs = [&](int u);
//#define x first
//#define y second
using namespace std;
const int mod=1e9+7;
int n,k;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
ll dp[5][100050][5];
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;vector<ll>a(n+10,0);for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=3;i++){for(int j=1;j<=n;j++){for(int k=1;k<=3;k++){dp[i][j][k]=-1e18;}}}dp[1][1][1]=a[1];dp[2][2][1]=a[2],dp[3][3][1]=a[3];for(int i=1;i<=n;i++){for(int j=1;j<=3;j++){dp[j][i+2][1]=max(dp[j][i+2][1],dp[j][i][1]+a[i+2]);dp[j][i+2][2]=max(dp[j][i+2][2],dp[j][i][2]+a[i+2]);dp[j][i+3][2]=max(dp[j][i+3][2],dp[j][i][1]+a[i+3]);dp[j][i+2][3]=max(dp[j][i+2][3],dp[j][i][3]+a[i+2]);dp[j][i+3][3]=max(dp[j][i+3][3],dp[j][i][2]+a[i+3]);dp[j][i+4][3]=max(dp[j][i+4][3],dp[j][i][1]+a[i+4]);}}if(n&1){ll res=-1e18;res=max(res,dp[1][n][3]);res=max(res,dp[1][n-1][2]);res=max(res,dp[1][n-2][1]);res=max(res,dp[2][n][2]);res=max(res,dp[2][n-1][1]);res=max(res,dp[3][n][1]);cout<<res<<endl;}else {ll res=-1e18;res=max(res,dp[1][n][2]);res=max(res,dp[1][n-1][1]);res=max(res,dp[2][n][1]);cout<<res<<endl;}
}
北京化工大学 2022-2023-1 ACM集训队每周程序设计竞赛(7)题解相关推荐
- 2021-2022-1 ACM集训队每周程序设计竞赛(5) - 问题 B: 跳蛙 - 题解
传送门 分割 题目描述 输入描述 数据范围: 输出描述 样例一 输入 输出 样例二 输入 输出 提示 题目分析 AC代码 分割 CMP 跳蛙 剪切 数学? 数学! 逃离 时间限制:1秒 空间限制:12 ...
- BUCT - 2021-2022-1 ACM集训队每周程序设计竞赛(10)题解
Bob和Alice(1) 思路: 模拟即可模拟即可模拟即可 时间复杂度:O1O1O1 #include <bits/stdc++.h> #define fer(i,a,b) for(int ...
- 2021-2022-1 ACM集训队每周程序设计竞赛(5) - 问题 C: 剪切 - 题解
传送门 分割 题目描述 输入描述 输出描述 样例一 输入 输出 样例二 输入 输出 提示 题目分析 AC代码 分割 CMP 跳蛙 剪切 数学? 数学! 逃离 时间限制:1秒 空间限制:128M 题目描 ...
- 北京化工大学2022-2023-1 ACM集训队每周程序设计竞赛(8)题解
文章目录 问题 A: 鬼抓人 问题 B: 坠落之前 问题 C: 数据结构:树的子结点计数 问题 D: 糖果合并 问题 E: 幼儿园排座 问题 F: 简单路径计数 (((糖豆人小专题( •̀ ω •́ ...
- 2021-2022-2 ACM集训队每周程序设计竞赛(1) - 问题 D: 点外卖 - 题解
题意: 有 nnn 道菜,mmm 张券,券的作用是将任意一道菜的价格变为原来的一半(下取整),且允许叠加使用,问最少花费多少钱. 思路: 每一张券最优的使用方法一定是对当前价格最高的菜使用,那么这道题 ...
- 2021-2022-2 ACM集训队每周程序设计竞赛(1) - 问题 E: 祖玛的复仇 - 题解
题意: 在长度为 n n n 的原字符串 S S S 找到中出现两次或两次以上的.相互之间没有重叠的连续子字符串的最大长度. 思路: 这道题的解法其实挺多的,大家可以之后多想下,我这里就只写一个最容易 ...
- 2021-2022-2 ACM集训队每周程序设计竞赛(1) - 问题 A: 排火车 - 题解
题意: S u n n y Sunny Sunny之后接 C l o u d y Cloudy Cloudy, C l o u d y Cloudy Cloudy之后接 R a i n y Rainy ...
- 2021-2022-2 ACM集训队每周程序设计竞赛(10) - 问题 A: 还原撕碎的字条,哄笑生气的毛毛 - 题解
传送门 还原撕碎的字条,哄笑生气的毛毛 题目描述 输入描述 输出描述 样例一 输入 输出 样例二 输入 输出 样例三 输入 输出 题目分析 AC代码 还原撕碎的字条,哄笑生气的毛毛 还原撕碎的字条,哄 ...
- 北京化工大学2022-2023-1 ACM集训队每周程序设计竞赛(11)题解
文章目录 问题 A: 起名废柴 问题 B: 可视消息 问题 C: 虫洞旅行 问题 D: 整数化简分析 问题 E: 向量选取 问题 F: 勤劳的扫地机器人 问题 A: 起名废柴 根据题意,判断字符串 T ...
最新文章
- 如何根据原理图画封装_生物水处理专用消泡剂是如何根据生物水处理工艺原理进行消泡的?...
- python 动态编译代码_使用PyQt(Python+Qt)+动态编译36行代码实现的计算器
- R语言笔记3:提取R对象的子集
- 2020年SAP项目艰辛曲折的开工历程 II
- 结构体命名中的尾标ST是什么意思?(struct)
- 陶陶的兔二,建好啦!
- yui3 html属性,YUI Rich Editor + invalidHTML + style
- 07MySQL综合应用
- SQL 之后,GQL 成为 ISO/IEC 国际标准数据库语言项目
- 【html+css3】在一张jpg图片上,显示多张透明的png图片
- Linux进程地址空间布局
- 洗车香波行业调研报告 - 市场现状分析与发展前景预测
- 华尔街日报:雅虎站在移动互联网时代悬崖边
- 滴滴曹乐:如何成为技术大牛?
- mysql查询一天内,一周,一个月内的消费记录
- 关于keil编译显示Flash Download failed -Could not load file xxxx.axf
- 迅睿CMS 全站生成静态
- 数据质量测试:测试数据有效性和准确性的方法
- 乐吾乐2D可视化智慧光伏能源赋能方案
- spring boot 资料整合