题解 | [SDOI2008]仪仗队 #

[SDOI2008]仪仗队

https://www.nowcoder.com/practice/41e95a615ff8414aa39e3993acfeddfc?tpId=388&tqId=11306677&channelPut=tracker1

从原点到点的这一条射线,如果,那么这条射线一定经过并且最先经过点

题目的意思相当于从朝这范围里面发射无数条射线,求每条射线最先经过的点的个数
范围是
或者时,只有一个点即或者
也满足条件
然后显然可以用欧拉函数直接得到,但是欧拉函数求的是有多少个与互质的数,所以结果得先乘以,然后最后加上
总代码:
#include<bits/stdc++.h>
using namespace std;

#define endl '\n'
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define HelloWorld IOS;


const int N = 4e4 + 10;


int prime[N], idx;
bool st[N];
int oula[N];

void get_prime_oula(){
    memset(st, false, sizeof(st));
    memset(oula, 0, sizeof(oula));
    idx = 0;
    oula[1] = 1;
    for(int i = 2; i <= N; i ++){
        if(!st[i]){
            prime[++ idx] = i;
            oula[i] = i - 1;
        }
        for(int j = 1; prime[j] <= N / i; j ++){
            st[prime[j] * i] = true;
            if(i % prime[j] == 0){
                oula[prime[j] * i] = oula[i] * prime[j];
                break;
            }
            else oula[prime[j] * i] = oula[i] * oula[prime[j]];
        }
    }
}

signed main(){
    HelloWorld;
    
    get_prime_oula();    
    int n; cin >> n;
    int ans = 0;
    for(int i = 2; i < N; i ++) ans += oula[i];
    cout << 2 * ans + 3 << endl;
    return 0;
}
全部评论

相关推荐

暴杀流调参工作者:春招又试了一些岗位,现在投递很有意思,不仅要精心准备简历,投递官网还得把自己写的东西一条一条复制上去,阿里更是各个bu都有自己的官网,重复操作无数次,投完简历卡完学历了,又该写性格测评、能力测评,写完了又要写专业笔试,最近还有些公司搞了AI辅助编程笔试,有些还有AI面试,对着机器人话也听不明白录屏硬说,终于到了人工面试又要一二三四面,小组成员面主管面部门主管面hr面,次次都没出错机会,稍有不慎就是挂。 卡学历卡项目卡论文卡实习什么都卡,没有不卡的😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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