备战蓝桥杯---刷杂题2

显然我们直接看前一半,然后我们按照斜行看,我们发现斜行是递增的,而同一行从左向右也是递增的,因此我们可以直接二分,同时我们发现对称轴的数为Ck,2k.

我们从16斜行枚举即可

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n;
LL C(int a,int b){
	LL res=1;
	for(int i=a,j=1;j<=b;i--,j++){
		res=res*i/j;
		if(res>n) return res;
	}
	return res;
}
bool check(int k){
	LL l=k*2,r=n;
	if(l>r) return 0;
	while(l<r){
		LL mid=l+r>>1;
		if(C(mid,k)>=n) r=mid;
		else l=mid+1;
	}
	if(C(r,k)!=n) return 0;
	cout<<(r+1)*r/2+k+1;
	return 1;
}
int main(){
	cin>>n;
	for(int k=16;;k--){
		if(check(k)){
			break;
		}
	}
}

2.spfa的本质(妙)

我们令fij表示在i步以内可以生成j作物的方法的集合,我们记录其最小时间,答案就是fn-1t,对于初始值,f0xi=0,对于fij,我们可以看看j的生成方式即可,即fij=min(fij,max(fi-1x,fi-1y)),复杂度为(n-1)k,我们加个spfa思想优化,j是由x,y更新的,只有x,y更新j才可能更新,

下面是AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=2010,M=200010;
int n,m;
int h[N],e[M],w[N],target[M],ne[M],idx;
int dis[N];
queue<int> q;
bool st[N];
void add(int a,int b,int c){
    e[idx]=b,target[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void spfa(){
    while(q.size()){
        int x=q.front();
        q.pop();
        st[x]=0;
        for(int i=h[x];i!=-1;i=ne[i]){
            int y=e[i],z=target[i];
            if(dis[z]>max(dis[x],dis[y])+max(w[x],w[y])){
                dis[z]=max(dis[x],dis[y])+max(w[x],w[y]);
                if(!st[z]){
                     q.push(z);
                     st[z]=1;
                }
               
            }
        }
    }
}
int main(){
    int k,T;
    cin>>n>>m>>k>>T;
    memset(h,-1,sizeof(h));
    for(int i=1;i<=n;i++) scanf("%d",&w[i]);
    memset(dis,0x3f,sizeof(dis));
    while(m--){
        int x;
        scanf("%d",&x);
        dis[x]=0;
        q.push(x);
        st[x]=1;
    }
    while(k--){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
        add(b,a,c);
    }
   spfa();
   cout<<dis[T];
}

3.欧拉函数:

下面是数学推导:

下面是AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){
    return b?gcd(b,a%b):a;
}
LL phi(LL m){
    LL res=m;
    for(LL i=2;i<=m/i;i++){
        if(m%i==0){
            while(m%i==0) m/=i;
            res=res/i*(i-1);
        }
    }
    if(m>1) res=res/m*(m-1);
    return res;
}
int main(){
    int T;
    cin>>T;
    while(T--){
        LL a,m;
        cin>>a>>m;
        LL d=gcd(a,m);
        cout<<phi(m/d)<<endl;
    }
}
相关推荐
倒头就睡的小比特9 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!9 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼10 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光11 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark11 小时前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her111 小时前
并查集-听课笔记
笔记·算法·并查集
码流子12 小时前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven12 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark12 小时前
从算法设计模式看编程思维的抽象能力4
算法
2601_9622186112 小时前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法