[intoj#7]最短距离

190227模拟

题目描述

给定一张 N 个点的有向图,点 i 到点 j 有一条长度为 i/gcd(i,j的边.

有个 Q 询问,每个询问包含两个数 xy,求从点 x 出发到点 y 的最短距离。

输入格式

第一行包含两个用空格隔开的整数 Q。

接下来 Q 行,每行两个整数 x 和 y。

输出格式

输出 Q 行整数,表示从点 x 出发到点 y 的最短距离。

提示与说明

对于30%的数据,1≤N≤100。

对于70%的数据,1≤N≤10^5

对于100%的数据,1≤x,y≤N≤10^7, Q≤ 10^5

 

虽然是求最短路,但这显然是一道数论题。

通过打表找规律,发现答案就是(x/gcd(x,y))的质因数之和。

筛质数的时候,每次把它被整除的最小质因数记下来....反正看代码吧

有个写了个√n的dalao的写法我也不懂,反正我一个一个质数枚举都会t

代码如下

#include<cstdio>
#include<iostream>
#define MogeKo qwq
using namespace std;
const int maxn = 1e7+5;
int prime[maxn],p[maxn];
int n,q,x,y,cnt;
bool vis[maxn];

int gcd(int a,int b) {
    if(b==0)return a;
    return gcd(b,a%b);
}

int solve(int x) {
    int sum = 0;
    while(x!=1) {
        sum += p[x];
        x /= p[x];
    }
    return sum;
}

void Prime(int N) {
    for(int i=2; i <= N; i++) {
        if(!vis[i]) {
            prime[++cnt]=i;
            p[i] = i;
        }
        for(int j=1; j<=cnt && prime[j]*i <= N; j++) {
            vis[prime[j]*i] = true;
            p[prime[j]*i] = prime[j];
            if(i%prime[j]==0)break;
        }
    }
}

int main() {
    scanf("%d%d",&n,&q);
    Prime(n);
    while(q--) {
        scanf("%d%d",&x,&y);
        if(x==y) {
            printf("0\n");
            continue;
        }
        x /= gcd(x,y);
        int ans = solve(x);
        if(!ans)ans = 1;
        printf("%d\n",ans);
    }
    return 0;
}

模拟Prime写崩了QAQQQQ(无能狂怒)

 

 19/3/30

我突然想起来这个好像可以用欧拉函数来做...

不用求素数表,直接根据唯一分解定理从2到n枚举就行了?不知道对不对

int euler(int n){
    int sum = 0;
    for(int i = 2;i*i <= n;i++)
        while(n%i==0){
            sum += i;
            n /= i;
        }
    if(n>1) sum += n;
    return sum;
}

 

转载于:https://www.cnblogs.com/mogeko/p/10444211.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值