Resistors in Parallel

Gym - 102028E

吐槽一下,网上搜索的题解一上来都是找规律,对于我这种对数论不敏感的人来说,看这种题解太难受了,找规律不失为一种好做法,但是题解仅仅包括找规律又有什么意义呢?

定义

\[f[i] = \begin{cases}\infin & \text{如果 i 有平方因子, 即$\exist d, d\ge 2$,使得 $i$ 能够被 $d^2$ 整除} \\i & otherwise\end{cases}
\]

又定义

\[s[i] = \frac{1}{{\sum_{d|i}\frac{1}{f[d]}}}
\]

给定一个 \(n (n\le 10^{100})\),求\(\min_{1\le i\le n} s[i]\)

如果 \(p\) 是一个质数,那么\(f[p] = p\) , \(s[p] = \frac{p}{p+1}\) , 又可以发现 \(s\) 是一个积性函数,当\(x,y\) 互质时,\(s(xy) = s(x)s(y)\) , (因为\(x,y\) 除了 1 之外没有公共因子,所以\(s(x)\) 和\(s(y)\) 相乘,分母会出现\(s(xy)\) 的所有分母)。

而积性函数又有一个性质:如果 \(x\) 表示为 \(x = \prod p_i^{c^i}\), 那么\(s(x) = \prod s(p_i^{c_i})\) 。

然后思考\(s(p_i^{c_i})\) 的值,由于 \(p^2,p^3...p^c\) 都是具有平方因子的数字,所以:\(s(p^i) = \frac{p}{p+1}, \forall i \in [1,c]\) 。

然后我们思考如何解决这个题,对于任意一个 \(x\) 都有 \(s(x) = \prod s(p_i)\) 而且 \(s(p) \lt 1\) ,并且随着 \(p\) 增大 \(s(p)\) 严格递减,所以:

\[\min_{1\le i \le n} s(i) = \prod_{1\le i\le k} s(p_i),\quad \text{并且}\prod_{1\le i \le k}p_i \le n ,\quad \text{$p_i$ 表示从2开始的第$i$个质数}
\]

另外当 n 等于 1 时,答案为 1。

所以我们只需要从小到大枚举最多100个数字(因为 n 总共才100位),找到公式描述中的 k,计算答案即可,注意答案中要求输出最简分数,所以在约分可以用一点小技巧(代码中有所体现),当然也可以直接求gcd来化简,但是C++实现的高精度操作除法比较麻烦。

关于高精度模板:https://www.cnblogs.com/1625--H/p/11141106.html

typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 100000 + 5;
int prime[N], m, v[N];
void init(int n){
for (int i = 2; i <= n;i++){
if(!v[i]){
prime[++m] = i;
}
for (int j = 1; j <= m && prime[j] <= n / i;j++){
v[i * prime[j]] = 1;
if(i % prime[j] == 0)
break;
}
}
}
struct BigInteger{
static const int BASE = 10000;
static const int WIDTH = 4;
vector<int> s;
BigInteger(ll num=0) { *this = num; }
BigInteger(string str) { *this = str; }
BigInteger(const BigInteger& t) { this->s = t.s; }
BigInteger operator = (ll num){
s.clear();
do{
s.push_back(num % BASE);
num /= BASE;
} while (num > 0);
return *this;
}
BigInteger operator = (string &str){
s.clear();
int x, len = (str.length() - 1) / WIDTH + 1;
for (int i = 0; i < len;i++){
int end = str.length() - i * WIDTH;
int start = max(0, end - WIDTH);
sscanf(str.substr(start, end - start).c_str(), "%d", &x);
s.push_back(x);
}
return *this;
}
bool cmp(vector<int> &A, vector<int> &B){
if(A.size() != B.size())
return A.size() < B.size();
for (int i = A.size() - 1; i >= 0;i--){
if(A[i] != B[i])
return A[i] < B[i];
}
return false;
}
bool operator < (BigInteger & b){
return cmp(s, b.s);
}
bool operator > (BigInteger & b){
return b < *this;
}
bool operator <= (BigInteger &b){
return !(b < *this);
}
bool operator >= (BigInteger &b){
return !(*this < b);
}
bool operator == (BigInteger &b){
return !(b < *this) && (*this < b);
}
vector<int> mul(vector<int>& A, int b);
BigInteger operator*(int& b);
};
ostream& operator << (ostream &out, const BigInteger & x){
out << x.s.back();
for (int i = x.s.size() - 2; i >= 0;i--){
char buf[20];
sprintf(buf, "%04d", x.s[i]);
for (int j = 0; j < strlen(buf);j++)
out << buf[j];
}
return out;
}
istream& operator>>(istream &in, BigInteger &x){
string s;
if(!(in>>s))
return in;
x = s;
return in;
}
vector<int> BigInteger::mul(vector<int>&A, int b){
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || t;i++){
if(i < A.size())
t += A[i] * b;
C.push_back(t % BASE);
t /= BASE;
}
return C;
}
BigInteger BigInteger::operator*(int &b){
BigInteger c;
c.s = mul(s, b);
return c;
}
int down[N];
int main() {
init(100000);
int T;
scanf("%d", &T);
while(T--){
BigInteger n;
cin >> n;
BigInteger acc = 1;
int pos = 0;
while(acc * prime[pos + 1] <= n){
pos++;
acc = acc * prime[pos];
}
for (int i = 1; i <= pos;i++){
down[i] = prime[i] + 1;
}
BigInteger fz = 1, fm = 1;
for (int i = 1; i <= pos;i++){
int flag = 0;
for (int j = 1; j <= pos;j++){
if(down[j] % prime[i] == 0){
down[j] /= prime[i];
flag = 1;
break;
}
}
if(!flag)
fz = fz * prime[i];
}
for (int i = 1; i <= pos;i++)
fm = fm * down[i];
cout << fz << '/' << fm << endl;
}
return 0;
}

贴个 python代码

N = 100010
prime = [0 for i in range(N)]
down = [0 for i in range(N)]
v = [0 for i in range(N)]
m = 0
T = 0
T = int(input())
def init(n):
global m
for i in range(2, n+1):
if v[i] == 0 :
m = m + 1
prime[m] = i
for j in range(1, m+1) :
if i * prime[j] > n :
break
v[i * prime[j]] = 1
if i % prime[j] == 0 :
break
maxn = 100000
init(maxn)
while T :
T -= 1
n = int(input())
pos = 0
acc = 1
while acc * prime[pos+1] <= n :
pos = pos + 1
acc = acc * prime[pos]
for i in range(1, pos+1):
down[i] = prime[i] + 1
fz = 1
fm = 1
for i in range(1, pos+1):
flag = 0
for j in range(1, pos + 1):
if down[j] % prime[i] == 0 :
down[j] = down[j] // prime[i];
flag = 1
break
if flag == 0:
fz = fz * prime[i]
for i in range(1, pos+1):
fm = fm * down[i] print("%d/%d"%(fz,fm))

2018 ACM-ICPC 焦作区域赛 E Resistors in Parallel的更多相关文章

  1. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

  2. 2016 年 ACM/ICPC 青岛区域赛 Problem C Pocky

    昨晚乱入学弟的训练赛,想了一下这个题.推导的过程中,加深了对公理化的概率论理解.$\newcommand{\d}{\mathop{}\!\mathrm{d}}$ 解法一 考虑 $ d < L$ ...

  3. Known Notation括号匹配类问题(2014年ACM/ICPC 亚洲区域赛牡丹江)

    题意: 给你数字或 * 的串,你可以交换一个*和数字.在最前面添1.在一个地方插入*,问你使串满足入栈出栈的(RNP)运算法则. 思路: 引用:https://blog.csdn.net/u01158 ...

  4. Digit sum (第 44 届 ACM/ICPC 亚洲区域赛(上海)网络赛)进制预处理水题

    131072K   A digit sum S_b(n)Sb​(n) is a sum of the base-bb digits of nn. Such as S_{10}(233) = 2 + 3 ...

  5. ICPC 2018 焦作区域赛

    // 2019.10.7 练习赛 // 赛题来源:2018 ICPC 焦作区域赛 // CF链接:http://codeforces.com/gym/102028 A Xu Xiake in Hena ...

  6. 2018ACM-ICPC焦作区域赛【反思总结】

    摸银结束回来,整个人都轻松了. 自CCPC打铁以来的这两个月真的太痛苦了. 俱乐部退役的退役停训的停训,好冷清啊. 前期切题很稳,前四题两个小时1A. 过了四题之后好像心态有点飘,然后开题就慢了,想题 ...

  7. 2016年11月ACM/ICPC亚洲区北京赛赛后总结

    2016年11月12到11月13为期两天的比赛,这是我们这个对第一次去打亚洲区域赛,经过这次比赛,我认识到了自己与别人的差距,也许我们与别人的起点不同,但这不是理由. 这次的比赛12号的热身赛两点开始 ...

  8. 2014ACM/ICPC亚洲区域赛牡丹江站汇总

    球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...

  9. 2019 ICPC 上海区域赛总结

    2019上海区域赛现场赛总结 补题情况(以下通过率为牛客提交): 题号 标题 已通过代码 通过率 我的状态 A Mr. Panda and Dominoes 点击查看 5/29 未通过 B Prefi ...

随机推荐

  1. C++把数字排序

    C++把数字排序 描述 思路 代码 描述 如题,详细如下: 输入不超过1024个数字,以特殊数字结尾,如(-999),把数字从小到大排序. 思路 目前,我们有两种思路可以写: 1是 在输入的时候,排序 ...

  2. 紧急预警】关于爆发的 incaseformat 病毒事件亲身体验

    相关报道 incaseformat病毒 360安全卫士服务号 https://mp.weixin.qq.com/s/KM6esd1eUlBt-YHtEwnfuw 广东省网络安全应急响应平台 https ...

  3. Both Dolby Atmos driver and API need to be installed问题的一个解决方法

    问题的原因在于缺少以下两个部分: Dolby Atmos driver:指你的声卡驱动中自带的杜比文件 如果驱动里没有,说明你的硬件可能不支持杜比,或者驱动太老没有包含杜比. Dolby Atmos ...

  4. 机器学习算法-logistic回归算法

    Logistic回归算法调试 一.算法原理 Logistic回归算法是一种优化算法,主要用用于只有两种标签的分类问题.其原理为对一些数据点用一条直线去拟合,对数据集进行划分.从广义上来讲这也是一种多元 ...

  5. 剑指Offer58-左转字符串

    题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=" ...

  6. windows鼠标右键添加快捷方式

    [win]+[R] 输入regedit 打开路径:计算机\HKEY_CLASSES_ROOT\DesktopBackground\Shell 创建应用文件,这里以putty为例 右键 Shell 新建 ...

  7. QA职责

  8. Kaggle泰坦尼克-Python(建模完整流程,小白学习用)

    参考Kernels里面评论较高的一篇文章,整理作者解决整个问题的过程,梳理该篇是用以了解到整个完整的建模过程,如何思考问题,处理问题,过程中又为何下那样或者这样的结论等! 最后得分并不是特别高,只是到 ...

  9. L(kali)A(apache)M(mysql)P(php)环境+wordpress站点搭建

    一:LAMP环境配置 首先LAMP(linux+apache+mysql+php)即为本次搭建网站所需的环境,由于本次使用的debian衍生版kali版本自带lamp,因此只要在服务器上启动相应服务既 ...

  10. 【Python】部署上手App后端服务器 - Linux环境搭建安装Python、Tornado、SQLAlchemy

    基于阿里云服务器端环境搭建 文章目录 基于阿里云服务器端环境搭建 配置开发环境 安装 Python 3.8.2 安装 Tornado 安装 MySQL 安装 mysqlclient 安装 SQLAlc ...