题解 | #小y的质数#【小y的质数.题解】

小y的质数

https://ac.nowcoder.com/acm/problem/22613

【小y的质数.题解】

看题解代码冗杂,我是没有看懂,所以就按着他的大部分意思在加上自己 YY 的想法给搞出来了。

我们都知道,对于 是恒成立的,不会的同学自行百度吧,基础知识。那么我们最终可以将给出的柿子化简成

我考场上也化简出这个柿子了,直观的讲就是在区间中找出和 互质的数,然后就是最简单的筛!

没错,就是暴力筛,我还以为需要反演或者欧拉之类的东西,因为以前见过一个类似的题目只不过 并不是给定的,所以就因为这我就没有去想筛.....

我们看怎么筛,简单,将 进行质因数分解,暴力的用每个素因子对区间进行筛除。只要和 有相同的质因子都晒去,不过可以发现,有重复。考虑容斥。

本以为这玩意直接上莫比乌斯函数就好,发现素因子是不间断的,所以我们就暴力的枚举质因子的乘积的形式,具体的,用 DFS 暴力的判断这个素因子我选还是不选。然后遵循容斥原理奇加偶减的原则大力容斥就好。

可是我代码中却是偶加奇减,这是因为我们筛的数都是不合法,最终是以 的形式求和,其中 是给定区间长度,那么这就有个负号了,自然而然的所有的加减就取反了。

/*
先写个暴力看柿子的正确性 
看来是正确的的,考虑化简 
只有奇数做贡献,复杂度/2 
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
const int B=1e7+10;
const int mod=1e9+7;
int read() {int x;scanf("%lld",&x);return x;}
int n,m,k;
int pre[B],vis[B];
int cnt;
void get(int x)
{
    for (int i=2;i*i<=x;i++)
    {
        if (x%i==0) 
        {
            pre[++cnt]=i;
            while (x%i==0) x/=i;
        }
    }
    if (x>1ll) pre[++cnt]=x;
}
int len;
int ans;
void dfs(int now)
{
    if (now==cnt)
    {
        int res=1ll,tot=0;
        for (int i=1;i<=cnt;i++) 
            if (vis[i]) res=res*pre[i],tot++;
        if (res==1 || tot==0) return;
        int num=0;
        num=m/res-(n-1)/res;
        if (tot&1) ans=(ans-num);
        else ans=(ans+num);
        return;
    }
    vis[now+1]=1;
    dfs(now+1);
    vis[now+1]=0;
    dfs(now+1);
}
signed main()
{
    n=read(),m=read(),k=read();
    int res=k; 
    k=2ll*k;
    m=m-2ll*res;
    if (n>m) 
    {
        printf("%lld",0);
        return 0;
    }
    if (n==0) n=1;
    get(k);
    len=m-n+1ll; 
    ans=len;
    dfs(0);
    printf("%lld",ans);
} 
/*
5 10 1
*/
全部评论
%%%%%%
点赞 回复 分享
发布于 2021-09-18 22:13
%%%%%%%%%%%
点赞 回复 分享
发布于 2021-09-18 15:29

相关推荐

04-16 10:27
已编辑
美团_Saas_后端开发
今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,拿到美团offer那会感觉自己天都亮了。没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
投了十几个无人回应
花环鞣: 佬,我隔壁的
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务