标签 ok

#include<bits/stdc++.h>
using namespace std; /*
求阶乘 去除尾部0
每次求阶乘时:结果去除尾0,并对 1e6取余
*/ typedef long long ll; ll n = 1325476;
const ll mod = 1e6; ll ans = 1; void solve(){
while(ans%10 == 0) ans = ans/10;
ans = ans%mod;
} int main(){
for(ll i = n;i>=1;i--){
ans = ans * i;
solve();
}
printf("%lld",ans);
return 0;
}
//137664
#include<bits/stdc++.h>
using namespace std; /*
2 * 5会产生0
做法:每次循环求阶乘时 统计2和5个数 并去除2和5,最后乘回来即可
*/ typedef long long ll; ll n = 1325476;
const ll mod = 1e6; ll ans = 1;
ll cnt1 = 0;
ll cnt2 = 0;
int main(){
for(ll i = 1;i <= n; i++){
ll x = i;
while(x%2==0) cnt1++,x=x/2;
while(x%5==0) cnt2++,x=x/5;
ans = ans * x % mod;
}
if(cnt1 - cnt2 > 0){
for(int i=1;i<=cnt1-cnt2;i++) ans = ans * 2 % mod;
}else{
for(int i=1;i<=cnt2-cnt1;i++) ans = ans * 5 % mod;
}
printf("%lld\n",ans);
return 0;
}
//137664

101串 ok

dfs搜索方法

#include<bits/stdc++.h>
using namespace std; int num[35];
long long ans = 0; /*
dfs枚举2^30种可能结果
运行100秒左右
*/ void dfs(int k){
if(k==31){
for(int i=1;i<=28;i++){
if(num[i] == 1 && num[i+1] == 0 && num[i+2] == 1){
ans++;
break;
}
}
return;
} num[k] = 1;
dfs(k+1);
num[k] = 0;
dfs(k+1);
} int main(){
dfs(1);
printf("%lld",ans);
return 0;
}
//1046810092

二进制枚举方法

#include<bits/stdc++.h>
using namespace std; /*
二进制枚举
1<<30种 也就是2^30可能情况
对于每个情况 枚举每一位 判断是否满足条件
*/ int ans = 0; int main(){
for(int i=0;i<(1<<30);i++){
int x = i;
int a = 0 ,b = 0, c = 0;
bool check = false;
while(x){
c = b;
b = a;
a = x & 1;
if(a && !b && c){
check = true;
break;
}
x >>= 1;
}
if(check) ans++;
}
cout<<ans<<endl;
return 0;
}
//1046810092

游戏 ok



#include<bits/stdc++.h>
using namespace std; typedef long long LL;
LL a = 482333897982347239LL;
LL b = 557432748293424892LL;
LL k = 1389472389742429877LL; //同余 (b-a) % mod = b*2 % mod
void test(){
LL mod = a + b;
cout<<(b-a) % mod<<endl;
cout<<b*2%mod<<endl;
} //快速乘:加法代替乘法
LL mmul(LL x,LL y,LL p){
LL ans = 0LL;
while(y){
if( y & 1LL) ans = (ans + x) % p;
x = (x + x) % p;
y >>= 1;
}
return ans;
} //快速幂
LL mpow(LL x,LL y,LL p){
LL ans = 1LL;
while(y){
if(y & 1LL) ans = mmul(ans,x,p);
x = mmul(x,x,p);
y >>= 1;
}
return ans;
} int main(){
LL mod = a + b; //首先 c + d = 2*a + b - a = a + b = mod
LL ans = mmul(a,mpow(2LL,k,mod),mod); //d = b - a = b - (mod - b) = 2*b - mod = 2*b %mod,所以 b-a 也就等价于 b*2,等价后a与b交不交换都无所谓(因为后面的操作都是*2)
printf("%lld\n",min(ans,mod-ans));//结果确保A更小,A可能是ans 也可能是mod-ans(b)
return 0;
}
//383513242709218605

公约数 ok

蒜头君有n个数,他想要从中选出k个数,使得它们的最大公约数最大。

请你求出这个最大的最大公约数。

输入格式

第一行输入两个整数 。

第二行输入 个整数 。

输出格式

输出一个整数。

数据范围

样例输入1

4 3

2 4 8 3

样例输出1

2

样例输入2

4 2

4 8 6 6

样例输出1

6

思路:

30% 暴力dfs 或者 状态压缩(二进制枚举)选出k个数

另外30% 由概率,直接输出 1。

100% 枚举可能的gcd 值,检查有多少元素被它整除即可。时间复杂度O(nlogn)

30%代码-dfs搜索

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
ll ans = 1;
ll gcd(ll a,ll b){
if(b==0)
return a;
return gcd(b,a%b);
} const int maxn = 1e6+10;
int n,k;
int a[maxn]; /*
dfs暴搜过30%数据
*/ /*
不确定的dp状态转移方程:dp[i][k] = max(dp[i][k],gcd(dp[j<i][k-1], a[i])
*/ void dfs(int cur,int have,ll _gcd){ if(cur == n+1 && have == k+1){
ans = max(ans,_gcd);
return;
}
if(cur > n+1) return;
if(have > k+1) return;
if(have == 1){
dfs(cur+1,have,_gcd);
dfs(cur+1,have+1,a[cur]);
}else{
dfs(cur+1,have,_gcd);
dfs(cur+1,have+1,gcd(a[cur],_gcd));
} } int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
dfs(1,1,0);
printf("%lld\n",ans);
return 0;
}

100%代码

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int N = 1e6 + 7;
const int mod = 1e9 + 7;
int a[N+10]; int main(){
int n,k,x;
memset(a,0,sizeof(a));
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&x);
a[x]++;//x的个数+1
}
int ans = 1;
//枚举gcd可能出现的值:从i=2 ~ N;
for(int i = 2 ;i < N; i++){
int cnt = 0;
for(int j = i;j < N; j += i) cnt += a[j]; //能被i整除的数 一定是 i i+i i+i+i ....
if(cnt >= k) ans = i;//比k大 那么选出k个数 他们的gcd就是当前的i
}
printf("%d\n",ans);
return 0;
}

蒜头图 ok



实际上就是问图里有多少个环,计环的个数为 k,则结果为2^k-1。

30% 状态压缩选出边,判断所选的边是否构成环

100% 并查集统计环的数量,使用并查集每次询问只需要判断这两点之前是否连通就可以了,为什么结果是2^k-1呢(k表示环的数量),有大佬说了:题目表明了“只要构成蒜头图就算一种情况”,那么也就是说从原图中取1个环也能构成环,取其中两个环也能构成环(有环就代表是蒜头图的子图,管你取几个环都是蒜头图).......C(n,i) i从1~n都能构成环 那么C(n,1) + C(n,2) + C(n,3) + C(n,n)就是答案,这个式子的值也等于2^n-1,因为C(n,0) + C(n,1) + C(n,2) + C(n,3) + C(n,n) 的结果等于2^n

100%代码-并查集统计环的数量

#include<bits/stdc++.h>
using namespace std; const int mod = 1046513837;
int n,m,f[200500]; int find(int x){
return f[x] == x ? x : f[x] = find(f[x]);
} void merge(int a,int b){
int x = find(a);
int y = find(b);
if(x != y ) f[x] = y;
} int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) f[i] = i;
long long ans = 1;
for(int i=1 ;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
int x = find(a), y = find(b);
if(x == y){//这里如果 两个点祖先一样 说明找到环了
ans <<= 1;
if(ans > mod) ans -= mod;
}else merge(a,b);
printf("%lld\n",ans-1);
}
return 0;
}

区间并 60% 线段树做法不会



30% 按照题意暴力计算,枚举权值区间,枚举给定的数组的区间 ok

60% 枚举所有的答案区间l~r,看看哪些区间能恰好分成两个不相交的区间,暴力做的话:枚举l和r共O(n2),加上判断是否恰好分成了两个区间共O(n3)。判断是否分成了两个区间可以用并查集来维护,查询复杂度可以降到O(1)。

具体怎么用并查集维护?没写代码,但我是这样想的,在原序列中 如果 a[i] 和 a[i-1] 是连续的 即(后面这个数比前面这个数值大1) 就把当前第i个数 加入第i-1的集合中,代表他们是一个区间的。后面查询是否分成两个区间时,只需查询l~r区间内的数被分成了几个集合就可以了。

这个思路我自认为没有问题emmmm

100% 线段树维护区间最大值、次大值、相应个数 O(nlogn) 不会

30%代码-暴力枚举:

#include<bits/stdc++.h>
using namespace std; const int maxn = 3*1e6+5;
int n;
int m[maxn];
int vis[maxn];
int ans = 0; /*
枚举l~r区间
枚举i~j区间
*/ int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&m[i]);
for(int l=1;l<=n;l++){
for(int r=l+1;r<=n;r++){
bool flag = false;
for(int a=1;a<=n;a++){
for(int b=a;b<=n;b++){
for(int c=b+1;c<=n;c++){
for(int d=c;d<=n;d++){
bool flag2 = true;
for(int i=1;i<=n;i++) vis[i] = 0;
for(int i=a;i<=b;i++) vis[m[i]] = 1;
for(int i=c;i<=d;i++) vis[m[i]] = 1;
for(int i=l;i<=r;i++){
if(vis[i] == 0){
flag2 = false;
break;
}
}
if(flag2 && r-l+1 == b-a+1 + d-c+1){
ans++;
flag = true;
//cout<<"l = "<<l<<" r = "<<r<<"a = "<<a<<" b = "<<b<<" c = "<<c<<" d = "<<d<<endl;
break;
}
if(flag) break;
}
if(flag) break;
}
if(flag) break;
}
if(flag) break;
}
// if(flag) continue;
}
}
cout<<ans<<endl;
return 0;
}
/*
5
5 4 3 1 2
*/

100%代码-线段树

#include<cstdio>
#include<algorithm>
#define mid (l+r)/2
#define lt (s<<1)
#define rt (s<<1|1)
#define Mn 300005
using namespace std;
long long ans;
int fc[Mn*4],fm[Mn*4],sm[Mn*4],sc[Mn*4];
int p[Mn],nt[Mn],add[Mn*4],n,i,k1,k2,x; void updata(int s)
{
int k1=lt,k2=rt;
if (fm[k1]>fm[k2]) swap(k1,k2);
if (fm[k1]<fm[k2])
{
fm[s]=fm[k1],fc[s]=fc[k1];
if (sm[k1]<fm[k2])
sm[s]=sm[k1],sc[s]=sc[k1];
else
if (sm[k1]==fm[k2])
sm[s]=sm[k1],sc[s]=sc[k1]+fc[k2];
else sm[s]=fm[k2],sc[s]=fc[k2];
}
if (fm[k1]==fm[k2])
{
fm[s]=fm[k1],fc[s]=fc[k1]+fc[k2];
if (sm[k1]<sm[k2])
sm[s]=sm[k1],sc[s]=sc[k1];
else
if (sm[k2]<sm[k1])
sm[s]=sm[k2],sc[s]=sc[k2];
else sm[s]=sm[k2],sc[s]=sc[k1]+sc[k2];
}
}
void pplus(int s,int up)
{
fm[s]+=up; sm[s]+=up;
add[s]+=up;
}
void push(int s)
{
if (add[s]!=0)
pplus(lt,add[s]),pplus(rt,add[s]),add[s]=0;
}
void work(int s,int l,int r,int ls,int rs,int up)
{
if (l>rs || r<ls) return;
if (ls<=l && r<=rs)
return(void)(pplus(s,up));
push(s);
work(lt,l,mid,ls,rs,up);
work(rt,mid+1,r,ls,rs,up);
updata(s);
}
void build(int s,int l,int r)
{
if (l==r) return(void)(fc[s]=1,sm[s]=1);
build(lt,l,mid); build(rt,mid+1,r);
updata(s);
}
void upans(int s,int l,int r,int ls,int rs)
{
if (ls<=l && r<=rs)
{
if (fm[s]==1 || fm[s]==2) ans+=fc[s];
if (sm[s]==1 || sm[s]==2) ans+=sc[s];
return;
}
if (ls>r || l>rs) return;
push(s);
upans(lt,l,mid,ls,rs);
upans(rt,mid+1,r,ls,rs);
updata(s);
}
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&p[i]),nt[p[i]]=i;
build(1,1,n);
for(i=n;i>=1;i--)
{
x=nt[i];
if (p[x+1]<i && p[x-1]<i) work(1,1,n,i,n,1);
if (p[x+1]<i && p[x-1]>i) work(1,1,n,i,p[x-1]-1,1);
if (p[x+1]>i && p[x-1]<i) work(1,1,n,i,p[x+1]-1,1);
if (p[x+1]>i && p[x-1]>i)
{
k1=p[x+1]; k2=p[x-1];
if (k1>k2) swap(k1,k2);
work(1,1,n,i,k1-1,1);
work(1,1,n,k2,n,-1);
}
upans(1,1,n,i,n);
}
printf("%lld",ans-n);
return 0;
}

2019 蓝桥杯国赛 B 组模拟赛 题解的更多相关文章

  1. 52-2018 蓝桥杯省赛 B 组模拟赛(一)java

    最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增.比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 313133131 ...

  2. 2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

    2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh ...

  3. 记 2019蓝桥杯校内预选赛(JAVA组) 赛后总结

    引言 好像博客好久没更新了 哈哈哈哈哈 趁现在有空更新一波 不知道还有没有人看 确实该记录一下每天做了什么了 不然感觉有些浑浑噩噩了 比赛介绍 全称: 蓝桥杯全国软件和信息技术专业人才大赛 蓝桥杯 实 ...

  4. 2015年第六届蓝桥杯C/C++B组省赛题目解析

    一.奖券数目 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其中 ...

  5. 2019 蓝桥杯国赛 B 组模拟赛 E 蒜头图 (并查集判环)

    思路: 我们看条件,发现满足条件的子图无非就是一些环构成的图, 因为只有形成环,才满足边的两个点都在子图中,并且子图中节点的度是大于0的偶数. 那么如果当前有k个环,我们可以选2^k-1个子图,为什么 ...

  6. 2019 蓝桥杯国赛 B 组模拟赛 D. 程序设计:公约数

    蒜头君有n个数,他想要从中选出k个数,使得它们的最大公约数最大.请你求出这个最大的最大公约数. 输入格式第一行输入两个整数 .第二行输入 个整数 . 输出格式输出一个整数. 数据范围 样例输入14 3 ...

  7. 2019 蓝桥杯省赛 A 组模拟赛(一)-修建公路

    题目: 蒜头国有 nn 座城市,编号分别为 0,1,2,3,...,n-1.编号为 x 和 y 的两座城市之间如果要修高速公路,必须花费 x|y 个金币,其中|表示二进制按位或. 吝啬的国王想要花最少 ...

  8. 2019 蓝桥杯省赛 A 组模拟赛(一)-忽明忽暗

    走廊里有 nn 盏灯,编号依次为 1,2,3,...,n,由学校电路控制中心管理.初始时,所有灯都是关闭的.某黑客入侵了学校电路控制中心,黑客想让灯忽明忽暗,进行了 n 轮操作.第 i 轮操作,会让所 ...

  9. 计蒜客 2019 蓝桥杯省赛 B 组模拟赛(三)一笔画

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> us ...

随机推荐

  1. PyCharm如何导入python项目,并配置虚拟环境

    Pycharm导入python项目 进入PyCharm后,点击File→Open,然后在弹窗中选择需要导入项目的文件夹: 打开了python项目后,需要配置该项目对应的python才可以正常运行: 配 ...

  2. VirtualBox设置自动适应屏幕

    设备 --> 安装增强功能 等待安装完成,就能自动适应屏幕大小了

  3. 一、itk在VS2019上面的安装 和例子(HelloWorld)运行

    一.Itk简介 vtk是专门用于医疗图像处理的函数库,类似opencv. 这篇博客主要是讲解安装vtk之后的例子的运行,即如何构建自己的第一个ITK例子 二.Itk安装 Itk安装参考这篇博客: ht ...

  4. NOIP 2016 玩具谜题

    洛谷 P1563 玩具谜题 洛谷传送门 JDOJ 3136: [NOIP2016]玩具谜题 D1 T1 JDOJ传送门 Description 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天 ...

  5. luoguP4022 [CTSC2012]熟悉的文章

    题意 显然这个\(L\)是可以二分的,我们只需要判断\(L\)是否合法即可. 显然有一个\(O(n^2)\)的DP: 设\(f_i\)表示当前匹配到\(i\)的最大匹配长度. \(f_i=max(f_ ...

  6. Java面试题的个人总结

    面试总结 第一轮:电话初面 第二轮:技能面谈[技能职位尽量避免多谈处理上的作业] 第三轮:高管复试 第四轮:HR终究供认 一面:首要供认对阿里的意向度(假定异地更会考虑对作业地址(杭州)的意向度!阿里 ...

  7. DRF--认证和权限

    前戏 大家都知道http协议是无状态的,每次发送请求他们怎么知道我们是不是登录过呢?我们可以在用户登录之后给用户一个“暗号”,下次请求的时候带着这个“暗号”来.我们拿自己存的和携带过来的进行对比,如果 ...

  8. Python程序中的线程操作-concurrent模块

    目录 一.Python标准模块--concurrent.futures 二.介绍 三.基本方法 四.ProcessPoolExecutor 五.ThreadPoolExecutor 六.map的用法 ...

  9. settings.py相关配置

    INSTALLED_APPS   #配置项目绑定的应用 TEMPLATES   #配置项目使用的模板引擎 DATABASES   #设定绑定的数据库 TIME_ZONE   #设定时区,时区的设定可能 ...

  10. 扎心一问!你凭什么成为top1%的Java工程师?

    目录 1.解决生产环境里的突发故障 2.对棘手的线上性能问题进行优化 3.锻造区别于普通码农的核心竞争力 4.打磨架构设计能力 5.你凭什么成为 top1%?   你工作几年了? 是否天天CRUD到吐 ...