CF1208G Polygons 数论
题目链接:https://codeforces.com/contest/1208/problem/G
题意:给定两个正整数\(n\)和\(k\),询问在一个圆上你最少需要几个点,才能在这些点上构造出\(k\)个边数小于等于\(n\)的正多边形。
分析:我们假设我们选取了一个正\(m\)边形,那么边数为\(m\)的因子的所有正多边形也就全部满足了。因此如果我们选了正\(m\)边形,我们相当于已经选择了所有正\(p\)边形(\(p | k\))(比如说我们想要选正六边形,那么必须先选择正三角形),增加的点数即为\(\varphi (m)\)。因此我们只需要对欧拉函数排序,并将前\(k\)个累加即可。
upd:官方答案的证明方法可能更好。我们在选正多边形时,可以使每一个正多边形的第一个点重合。那么正\(m\)边形的每一个点在圆上的位置就可以表示为\(0, \frac{1}{m} , \frac{2}{m} , ... , \frac{m-1}{m}\)。因此在选择了\(k\)个正多边形后,最简真分数的总数即为我们要求的答案。于是只需要将我们选择的\(k\)个正多边形的欧拉函数累加即为答案,因为欧拉函数就是互质数数量,也就是新增加的点数。
AC代码:
#include <bits/stdc++.h>
#define rep(i, a, b) for(long long i = a; i <= b; ++i)
using namespace std;
void io() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}
long long ans = 2;
const int maxn = 1000000;
bool vis[maxn + 5];
int prime[maxn + 5], phi[maxn + 5], n, k, cnt;
void Phi() {
phi[1] = 1; vis[1] = true;
for (int i = 2; i <= maxn; i++) {
if (!vis[i]) prime[cnt++] = i, phi[i] = i - 1;
for (int j = 0; j < cnt&&prime[j] * i <= maxn; j++) {
vis[prime[j] * i] = 1;
if (i%prime[j] == 0) {
phi[i*prime[j]] = phi[i] * prime[j];
break;
}
phi[i*prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
vector<int> v;
int main() {
io(); cin >> n >> k;
if (k == 1) { cout << 3; return 0; }
Phi();
rep(i, 3, n) v.emplace_back(phi[i]);
sort(v.begin(), v.end());
rep(i, 0, k - 1) ans += v[i];
cout << ans;
}
CF1208G Polygons 数论的更多相关文章
- Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) G. Polygons 数论
G. Polygons Description You are given two integers
- cf1208G Polygons 欧拉函数
链接 cf 给你两个正整数\(n\)和\(k\),询问在一个圆上你最少需要几个点构才能造出\(k\)个边数小于等于\(n\)的正多边形 思路 深受迫害,所以写的详细一点,不会请留言. 性质1 考虑加进 ...
- 「CF1208G」 Polygons
「CF1208G」 Polygons 似乎我校神犇在很久以前和我提过这题? 首先有一点显而易见:这 \(k\) 个多边形肯定至少有一个公共的顶点.假设我们将此点定义为起点. 那么对于一个正 \(n\) ...
- Codeforces Round #382 Div. 2【数论】
C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...
- NOIP2014 uoj20解方程 数论(同余)
又是数论题 Q&A Q:你TM做数论上瘾了吗 A:没办法我数论太差了,得多练(shui)啊 题意 题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, ...
- 数论学习笔记之解线性方程 a*x + b*y = gcd(a,b)
~>>_<<~ 咳咳!!!今天写此笔记,以防他日老年痴呆后不会解方程了!!! Begin ! ~1~, 首先呢,就看到了一个 gcd(a,b),这是什么鬼玩意呢?什么鬼玩意并不 ...
- hdu 1299 Diophantus of Alexandria (数论)
Diophantus of Alexandria Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)
4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 290 Solved: 148[Submit][Status ...
- bzoj2219: 数论之神
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
随机推荐
- 网格布局 grid(1)
目录 网格布局 grid(1) 实现方式 对容器设置的属性 行高与列宽的设置 单元格的间距 内容的位置 表格在容器的位置 兼容问题 网格布局 grid(1) 实现方式 display:grid 也可成 ...
- FOJ-2013 A Short Problem (前缀和)
Problem Description The description of this problem is very short. Now give you a string(length N), ...
- Ubuntu 安装交叉编译器出错问题
安装教程网上有很多,可参考:Ubuntu14.04(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境搭建 但是我的问题一直是路径搭好了,就是找不到文件:反复查找,花了 ...
- 笔记(tm_springboot)
1.@change="getFile($event)" 2.File imageFolder= new File(request.getServletContext().getRe ...
- python:复制文件及文件夹
#!/usr/bin/python# -*- coding:utf-8 -*- import shutil #shutil.copy(文件1,文件2)#将源内容复制到目标文件中.d.txt不存在则创建 ...
- sql查询 —— 分组
-- 分组 -- group by -- 分组只有与聚合函数一起使用才能发挥作用 -- 分组只限于字段分明 例如 性别 ,部门, --列出所有性别 select gender from student ...
- 通过属性选择器找元素,可以通过$(__).length是否为0来判断是否找到了元素
通过属性选择器找元素,可以通过$("").length是否为0来判断是否找到了元素. 为0的时候表示没有找到,其余则返回找到了多少个. 不能通过$("")是否为 ...
- char nchar varchar nvarchar varchar2区别
char(n):长度不可变,长度为n个字节,非Unicode字符 nchar(n):长度不可变,长度为2n个字节,Unicode字符 varchar(n):长度可变,长度为n个字节,非Unicode字 ...
- IDEA常用操作链接
idea中svn的提交.更新等操作 https://jingyan.baidu.com/article/375c8e19e3c47a25f3a22955.html Idea 部署SVN详细步骤以及上传 ...
- ubuntu18.04双卡机安装ubidia驱动遇到的坑
在ubuntu 18的软件更新中选择英伟达驱动进行安装,输入nvidia-smi总是提示缺少驱动,未驱动之类的报错. 何解? 最初以为安装系统的问题,重装ubuntu也未果. 最后查了很多资料,找到一 ...