[Codeforces Round #194 (Div. 2)] Secret 解题报告 (数学)
Posted xxzh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Codeforces Round #194 (Div. 2)] Secret 解题报告 (数学)相关的知识,希望对你有一定的参考价值。
题目链接:http://codeforces.com/problemset/problem/334/C
题目:
题目大意:
给定数字n,要求构建一个数列使得数列的每一个元素的值都是3的次方,数列之和S大于n,且删掉数列中的任意一个元素数列之和都会小于n,最小化这个数列的长度
题解:
我们考虑从小到大枚举k,取最小的k,使得,答案就是$n/3^k+1$
为什么呢?
我们考虑一个合法的数列,其中最小的元素是A,那么S一定是A的倍数。假设n是A的倍数,又S>n,那么S-A>=n,这样的话去掉A这个数列依旧大于等于n,数列就不合法了。
所以我们有n一定不是A的倍数。
于是我们从小到大枚举A的大小,直到找到最小的A满足n不是A的倍数,那么就直接用面值为A的硬币就可以了。
也许有为什么不用更大的满足n不是A的倍数的A的疑惑,其实更大的话也都可以表示成最小的A的倍数,那显然是没有用A优的
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; long long n; int main() { cin>>n; while(n%3==0) { n/=3; } cout<<n/3+1<<endl; return 0; }
以上是关于[Codeforces Round #194 (Div. 2)] Secret 解题报告 (数学)的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 24 D
Codeforces Round #797 (Div. 3) D, E, F, G题题解
Codeforces Round #402 (Div. 2) D
Codeforces Round #408 (Div. 2) D