备战蓝桥杯---刷杂题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 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore3 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考4 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX5 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面6 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号6 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽6 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI6 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者8 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者8 小时前
【征程6】校准量化中HistogramObserver解析
算法