巧克力棒(sticks.cpp)

Description

给定 n 根巧克力棒,初始第 i 根长度为 ai。
每次你可以挑出其中一根,你有以下两种选择:
1.吃了它
2.假设它的长度为 d,若 d>1,可以把 d 分成几根等长的的巧克力棒。即选择 x,
满足 x | d(这是约数符号)且 x>1,分成 x 根长度为 d/x 的巧克力棒。问最多可以进行多少轮,使得所有巧克力棒都被吃掉。

题解

做法一:

只要知道样例是怎么算出来的,也就知道怎么做了。

以24为例:24→8 8 8→4 4 4 4 4 4→2 2 2...2 2(12个)→1 1...1 1(24个)

答案为1+3+6+12+24=46

显然要让较大的因子贡献的次数多一些,所以先分大的。假设要分解x,找出n最大的质因子x,分成x份的n/x,重复这个过程。线性筛,枚举2~sqrt(n)之间的质数,1~n之间的质数个数是n/log n。复杂度为O(n*sqrt(|Ai|)。

做法二:

若n=1时,答案肯定是1。当n=2时,可以将2拆成2个1,答案即为1+2=3。当n=4时,可以将4拆成2个2,答案即为2*3+1=7。当n=8时,可以将8拆成2个4,答案即为2*7+1=15。同理,24可以拆成3个8,答案即为3*15+1=46。

code

做法一咕咕咕了,明天再补……这里的代码是根据做法二写的。

 1 //sticks
 2 #include<bits/stdc++.h>
 3 #define int long long
 4 using namespace std;
 5 int n,x,sum,ans;
 6 signed main(){
 7     freopen("sticks.in","r",stdin);
 8     freopen("sticks.out","w",stdout);
 9     scanf("%lld",&n);
10     while(n--){
11         scanf("%lld",&x),sum=1;
12         for(int i=2;i<=x;i++){
13             if(i*i>x) i=x; 
14             while(x%i==0) x/=i,sum=sum*i+1;
15         }
16         ans+=sum;
17     }
18     printf("%lld\n",ans);
19     return 0;
20 }

bat在线测试,内附测试数据[click me]

猜你喜欢

转载自www.cnblogs.com/maoyiting/p/sticks.html
cpp