分治+快速幂(p1010)

P1010 [NOIP 1998 普及组] 幂次方

题目描述

任何一个正整数都可以用 \(2\) 的幂次方表示。例如 $137=27+23+2^0 $。

同时约定次方用括号来表示,即 \(a^b\) 可表示为 \(a(b)\)

由此可知,\(137\) 可表示为 \(2(7)+2(3)+2(0)\)

进一步:

\(7= 2^2+2+2^0\) ( \(2^1\)\(2\) 表示),并且 \(3=2+2^0\)

所以最后 \(137\) 可表示为 \(2(2(2)+2+2(0))+2(2+2(0))+2(0)\)

又如 \(1315=2^{10} +2^8 +2^5 +2+1\)

所以 \(1315\) 最后可表示为 \(2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)\)

输入格式

一行一个正整数 \(n\)

输出格式

符合约定的 \(n\)\(0, 2\) 表示(在表示中不能有空格)。

输入输出样例 #1

输入 #1

1315

输出 #1

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

说明/提示

【数据范围】

对于 \(100\%\) 的数据,\(1 \le n \le 2 \times {10}^4\)

AC代码

其实可以不用快速幂,但这里主要展示快速幂算法模板

#include<bits/stdc++.h>
using namespace std;
int a[21];

int mi(int x,int y){
    if(y==0) return 1;
    if(y==1) return x;
    int m=y/2;
    int half=mi(x,m);
    if(y%2==0) return half*half;
    else return half*half*x;
}

void solve(int x){
    for(int i=14;i>=0;i--){
        if(a[i]<=x){
            if(i==0) cout<<"2(0)";
            else if(i==1) cout<<"2";
            else{
                cout<<"2(";
                solve(i);
                cout<<")";
            }
            x-=a[i];
            if(x!=0) cout<<"+";
        }
    }
}

int main(){
    int n;
    cin>>n;
    for (int i = 0; i <= 14; i++)
    {
        a[i]=mi(2,i);
    }
    solve(n);
    return 0;
}
posted @ 2025-11-10 08:54  sadmax11  阅读(5)  评论(0)    收藏  举报