LuoguP1010幂次方

来源:互联网 发布:蕉下伞是一场骗局知乎 编辑:程序博客网 时间:2024/05/17 06:45

先吐槽一下:

2=2(2(0))

这样变应该好一些吧(神改变…)
不说别的:
先换成2进制:
1315=10100100011
或:
1315=210+28+25+21+20
接着就是对每个值继续进行操作:

10=2^3+2^18=2^35=2^2+2^03=2^1+2^01=2^0

然后,就是:

#1AC0ms/11882kB#2AC0ms/11882kB#3AC0ms/11882kB#4AC0ms/11882kB#5AC0ms/11882kB

先分析一下复杂度:
显然每次变为2的几次方,就是O(logn)
代码:

/*ID:hh826532PROB:LANG:C++*/#define _FILE_ ""#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#include<vector>#include<map>#include<queue>#include<time.h>#include<fstream>#include<string>#include<set>#include<list>#include<stdlib.h>#define fr(i,a,b) for(int i=a,_end_=b;i<=_end_;i++)#define fd(i,a,b) for(int i=a,_end_=b;i>=_end_;i--)#define frei(s) freopen(s,"r",stdin)#define freo(s) freopen(s,"w",stdout)#define ll long long#define u unsignedusing namespace std;#define rt return#define inf 0x3f3f3f3f#define infll 4557430888798830399ll#define pc(x) putchar(x)#define spc putchar(' ')#define mem(x,y) memset(x,y,sizeof(x))#define memm(x,y,z) memset(x,y,sizeof(x[0])*z)#define gc getchar()#define ln pc('\n')#define writeint(x) printf("%d",x)#define lowbit(x) (x&(-x))int readuint(){    int s=0;    char c=getchar();    while(c<'0'||c>'9')c=gc;    while(c>=48&&c<='9'){        s=s*10+c-48;        c=gc;    }    rt s;}int readint(){    int s=0,k=1;    char c=getchar();    while((c<'0'||c>'9')&&c!='-')c=gc;    if(c=='-'){        k=-1;        c=gc;    }    while(c>=48&&c<='9'){        s=s*10+c-48;        c=gc;    }    rt s*k;}void OPENFILE(){    char FILENAME[50];    if(strlen(_FILE_)==0)rt;    sprintf(FILENAME,"%s.in",_FILE_);    frei(FILENAME);    sprintf(FILENAME,"%s.out",_FILE_);    freo(FILENAME);}double log(double x,double y){    rt log10(x)/log10(y);}void print(int x){    int maxx=log(x,2);    while(x)    {        x-=1<<maxx;        if(maxx==1)            pc('2');        else            if(maxx==0)            {                pc('2');                pc('(');                pc('0');                pc(')');            }            else            {                pc('2');                pc('(');                print(maxx);                pc(')');            }        if(x)        {            pc('+');            maxx=log(x,2);        }    }}int main(){    OPENFILE();    print(readuint());    rt 0;}
2 0
原创粉丝点击