2018 ACM-ICPC 焦作区域赛 E Resistors in Parallel
Resistors in Parallel
吐槽一下,网上搜索的题解一上来都是找规律,对于我这种对数论不敏感的人来说,看这种题解太难受了,找规律不失为一种好做法,但是题解仅仅包括找规律又有什么意义呢?
定义
\]
又定义
\]
给定一个 \(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)\) 严格递减,所以:
\]
另外当 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的更多相关文章
- 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)
		
队名:Unlimited Code Works(无尽编码) 队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...
 - 2016 年 ACM/ICPC 青岛区域赛 Problem C Pocky
		
昨晚乱入学弟的训练赛,想了一下这个题.推导的过程中,加深了对公理化的概率论理解.$\newcommand{\d}{\mathop{}\!\mathrm{d}}$ 解法一 考虑 $ d < L$ ...
 - Known Notation括号匹配类问题(2014年ACM/ICPC 亚洲区域赛牡丹江)
		
题意: 给你数字或 * 的串,你可以交换一个*和数字.在最前面添1.在一个地方插入*,问你使串满足入栈出栈的(RNP)运算法则. 思路: 引用:https://blog.csdn.net/u01158 ...
 - 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 ...
 - ICPC 2018 焦作区域赛
		
// 2019.10.7 练习赛 // 赛题来源:2018 ICPC 焦作区域赛 // CF链接:http://codeforces.com/gym/102028 A Xu Xiake in Hena ...
 - 2018ACM-ICPC焦作区域赛【反思总结】
		
摸银结束回来,整个人都轻松了. 自CCPC打铁以来的这两个月真的太痛苦了. 俱乐部退役的退役停训的停训,好冷清啊. 前期切题很稳,前四题两个小时1A. 过了四题之后好像心态有点飘,然后开题就慢了,想题 ...
 - 2016年11月ACM/ICPC亚洲区北京赛赛后总结
		
2016年11月12到11月13为期两天的比赛,这是我们这个对第一次去打亚洲区域赛,经过这次比赛,我认识到了自己与别人的差距,也许我们与别人的起点不同,但这不是理由. 这次的比赛12号的热身赛两点开始 ...
 - 2014ACM/ICPC亚洲区域赛牡丹江站汇总
		
球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...
 - 2019 ICPC 上海区域赛总结
		
2019上海区域赛现场赛总结 补题情况(以下通过率为牛客提交): 题号 标题 已通过代码 通过率 我的状态 A Mr. Panda and Dominoes 点击查看 5/29 未通过 B Prefi ...
 
随机推荐
- Linux下MiniGUI库的安装
			
Linux下MiniGUI库的安装 今天试了下安装MiniGUI的库 先仿照官网的教程安装 传送门:MiniGUI官网 一.配置依赖环境 安装构建工具 apt install binutils aut ...
 - Centos搭建Git服务端
			
首先需要安装git,可以使用yum源在线安装 yum install -y git 创建一个git用户,用来运行管理git服务 adduser git 初始化git仓库(这里我们选择/home/git ...
 - Windows DHCP最佳实践(四)
			
这是Windows DHCP最佳实践和技巧的最终指南. 如果您有任何最佳做法或技巧,请在下面的评论中发布它们. 在本指南(四)中,我将分享以下DHCP最佳实践和技巧. 使用DHCP中继代理 防止恶意D ...
 - 利用sql_tuning_Advisor调优sql
			
1.赋权给调优用户 grant ADVISOR to xxxxxx; 2.创建调优任务 使用sql_text创建 DECLARE my_task_name VARCHAR2 (30); my_sqlt ...
 - Spring Validation 验证
			
基本配置 1.pom引入maven依赖 <dependency> <groupId>javax.validation</groupId> <artifactI ...
 - [Usaco2007 Dec]宝石手镯
			
题目描述 贝茜在珠宝店闲逛时,买到了一个中意的手镯.很自然地,她想从她收集的 N(1 <= N <= 3,402)块宝石中选出最好的那些镶在手镯上.对于第i块宝石,它的重量为W_i(1 & ...
 - 24V转5V稳压芯片,高效率的同步降压DC-DC变换器3A输出电流
			
PW2330开发了一种高效率的同步降压DC-DC变换器3A输出电流.PW2330在4.5V到30V的宽输入电压范围内工作集成主开关和同步开关,具有非常低的RDS(ON)以最小化传导损失.PW2330采 ...
 - 【工具篇】Mysql的安装和使用
			
[导读]Mysql是数据分析师入门级的技能之一,对于很多小白同学来说,可能还没有机会接触SQL知识.那么我们如何熟悉和练习SQL呢,今天教大家安装两个软件:MySQL和Navicat.后续我们会推出S ...
 - Android 开发学习进程0.27  kotlin使用 和viewbinding的使用
			
kotlin-android-extensions 插件被废弃 笔者曾经尝试写过一部分的kotlin代码 主要是项目中一些代码是kotlin完成的,其中我认为 kotlin的kotlin-androi ...
 - (14)-Python3之--虚拟环境virtualenv
			
1.安装virtualenv pip install virtualenv 如果是在Linux下需要把virtualenv添加到/usr/bin目录下 # find / -name virtualen ...