备战蓝桥杯---刷杂题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;
    }
}
相关推荐
先吃饱再说2 小时前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰4 小时前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术6 小时前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六9 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术10 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize10 小时前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考1 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC2 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode