目录
枚举
P8754 [蓝桥杯 2021 省 AB2] 完全平方数
质因数定义:
思路:
所以,我们先将读入的 n 进行质因数分解。对于分解的每一个质数,如果它的指数为奇数,则 x 的因子就必须有这个质数。
特判:注意题目要求,n不一定是完全平方数,n*x才是 ,所以会出现n未除尽的情况,因为n这时不是完全平方数
带有质因数分解模板的代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=2e6+10;
ll n;
ll cnt;//每个质因子的位置 ,同时表示质因子的个数
ll ans;
ll p[N],g[N];//质因子,质因子指数
int main()
{
cin>>n;//注意题目要求,n不一定是完全平方数,n*x才是
for(ll i=2;i*i<=n;i++)//枚举的范围是2~根号n
{
if(n%i==0) cnt++;//作为每个质因子的位置标号
// p[cnt]=i;//存入质因子
while(n%i==0)//进行循环求n每一个质因子的指数
{
p[cnt]=i;
g[cnt]++;
n/=i;
}
}
if(n>1)//特判:当n没有被除尽时需要将剩下的数存入数组
//如:360的质因子为2(^3),3(^3),5,在这种情况下将5特判存入
{
p[++cnt]=n;
g[cnt]++;
}
//以上是质因数分解模板
ans=1;
for(int i=1;i<=cnt;i++)
{
if(g[i]%2)//如果指数是奇数 ,不一定只有一个数指数是奇数,所有ans要用到*
ans*=p[i];//那么就要补上一个这个质数
}
cout<<ans<<endl;
return 0;
}
简洁代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e6+10;
long long int n,ans=1;
long long int pri[N];
int main()
{
cin>>n;
for(long long int i=2;i*i<=n;i++)
{
int cnt=0;//计数,表示质因数pri[i]的指数
while(!(n%i)) cnt++,n/=i;
if(cnt%2) ans*=i;//如果指数不是偶数,在x中要有一个这样的只因子,保证指数为偶数
}
if(n>1) ans*n;//注意n没有分尽的情况
cout<<ans<<endl;
return 0 ;
}
P8627 [蓝桥杯 2015 省 A] 饮料换购
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int ans=n;//总共能喝到的饮料数,一开始是n瓶
while(n>2)//对瓶盖换购情况进行遍历
{
ans+=n/3;
int r=n%3;//换后剩下的瓶盖
n/=3;
n+=r;
}
cout<<ans<<endl;
return 0;
}
数字三角形dp(二维dp)
P8707 [蓝桥杯 2020 省 AB1] 走方格
这是一个三角形dp问题,首先要想到求解dp问题时的四个步骤:动态规划四步骤:定义数组、状态转移方程、初始化、写递推
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100+10;
int n,m;
int f[N][N];//f[i][j]表示到第i行第j列的方案数
int main()
{
cin>>n>>m;
f[1][1]=1;//初始化
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j]+=f[i-1][j];//走行方向
f[i][j]+=f[i][j-1];//走列方向
if(i%2==0&&j%2==0)
f[i][j]=0;//不能走,方案数设为0
}
}
cout<<f[n][m]<<endl;
return 0;
}
找规律&模拟题
P8700 [蓝桥杯 2019 国 B] 解谜游戏
思路
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int t;
string a,b,c;//外圈 中圈 内圈
int main()
{
cin>>t;
while(t--)
{
int flag=0;
cin>>a>>b>>c;//外 中 内
for(int i=0;i<4;i++)//遍历内圈的4个棒
{
//将桶设在for循环内,保证每次对新的测试点都有新的桶
map<char,int> mp;//设置一个桶,存放每次遍历的棒和对应颜色棒的数量
mp[a[i]]++,mp[a[i+4]]++,mp[a[i+8]]++;//外圈有三个对应的位置
mp[b[i]]++,mp[b[i+4]]++;//中圈有对应的两个位置
mp[c[i]]++;
if(mp['Y']!=1||mp['R']!=2||mp['G']!=3)
{
flag=1;
}
}
if(flag)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}
P8748 [蓝桥杯 2021 省 B] 时间显示
注意:long long 为1e18,使用longlong 类型
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
ll n;
cin>>n;
n/=1000;//将毫秒换为秒
ll h=n/3600%24;//小时,1h=3600s,小时取大于3600s的,所以用除,并且
//题目要求小时是0~23,所以需要模与24
ll m=n%3600/60;//分,小于3600s(1h),大于60(1s)
ll s=n%60;//秒,小于1s
printf("%02d:%02d:%02d",h,m,s);
return 0;
}