牛客寒假算法基础集训营5 A:炫酷双截棍+G:炫酷数字(唯一分解定理+埃式筛法)+J:炫酷数学(快速幂)

本文深入解析了三道炫酷的算法题目,包括双截棍距离问题、数字的质因数分解及计数,以及数学位运算挑战。通过代码示例详细讲解了埃式筛法的应用、因子数的统计,以及快速幂计算。适合对算法有兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题A】

炫酷双截棍

【题解】

易得,木棍能到达的点的距离原点的范围为[max(0,abs(l1-l2),l1+l2],分类讨论即可。

【代码】

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int l1,l2,t; scanf("%d%d%d",&l1,&l2,&t);
    double l=abs(l1-l2),r=l1+l2;
    while(t--)
    {
        double x,y; scanf("%lf%lf",&x,&y);
        double d=sqrt(x*x+y*y);
        double ans;
        if(d<l) ans=l-d;
        else if(d>r) ans=d-r;
        else ans=0;
        printf("%.8lf\n",ans);
    }
    return 0;
}

【题G】

炫酷数字

【题解】

根据唯一分解定理,任意一个大于1的正整数都能表示成若干个质数的乘积,且表示的方法是唯一的。换句话说,一个数能被唯一地分解成质因数的乘积。

公式:n = P1^a1 * P2^a2 * …………* (P1 < P2 < ……Pn);

利用类似素数一般筛即埃式筛法来对因子数计数,取一个数i,并令i的倍数的因子数+1。

(对素数筛感兴趣的传送门这里:判断素数(一般筛到线性筛)

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+1;
int ans[maxn],cnt[maxn]={0};
int main()
{
    memset(ans,-1,sizeof(ans));
    for(int i=1;i<maxn;i++)
    {
        for(int j=i;j<maxn;j+=i)
            cnt[j]++;
        if(ans[cnt[i]]==-1) ans[cnt[i]]=i;
    }
    int n,t; scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        printf("%d\n",ans[n]);
    }
    return 0;
}

【题J】

炫酷数学

【题解】

易得,每一位只有在(0,0)(0,1)(1,0)的三种情况时满足条件,答案即为3^M。

【代码】

#include <bits/stdc++.h>
const int mod=998244353;
typedef long long ll;
ll quick_pow(ll a,ll b)
{
    ll tmp=a;
    ll sum=1;
    while(b)
    {
        if(b&1) sum=sum*tmp%mod;
        tmp=tmp*tmp%mod;
        b>>=1;
    }
    return sum;
}
int main()
{
    int m; scanf("%d",&m);
    printf("%lld\n",quick_pow(3,m));
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值