长脖子鹿省选模拟赛 [LnOI2019SP]快速多项式变换(FPT)

本片题解设计两种解法

果然是签到题...

因为返回值问题T了好久...

第一眼:搜索大水题?

 然后...竟然A了

 1 #include<cstdio>
 2 #include<queue>
 3 #include<iostream>
 4 #include<cstring>
 5 #define int long long
 6 using namespace std;
 7 inline int read(){
 8     int ans=0,f=1;char chr=getchar();
 9     while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();}
10     while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
11     return ans*f;
12 }int fm,m,tot,a[105],x,ff,p[105],q[105];
13 void dfs(int x,int now){
14     if(ff) return;
15     if(x==0&&now>=m) return;
16     if(now<m){
17         ff=1;
18         int t=100;
19         while(p[t]==0) t--;
20         cout<<t+1<<endl<<now<<" ";
21         for(int i=1;i<=t;i++) cout<<p[i]<<" ";
22         return;
23     }
24     int t=now/a[x];
25     for(int i=t;i>=0;i--)    p[x]=i,dfs(x-1,now-a[x]*i);
26 }
27 signed main(){
28     m=read(),fm=read();
29     x=1;a[0]=1;
30     while(x<fm&&tot<=101){a[++tot]=x*m;x=x*m;}
31     dfs(tot,fm);
32     return 0;
33 }

 但其实只要分析一下,就发现式子跟进制转换有很大关系啊,我们只要把fm当做m进制数来处理即可

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<cstdlib> 
 7 #include<ctime>
 8 #define int long long
 9 using namespace std;
10 inline int read(){
11     int ans=0,f=1;char chr=getchar();
12     while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();}
13     while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
14     return ans*f;
15 }void write(long long x){
16     if(x < 0) putchar('-'),x = -x;
17     if(x > 9) write(x / 10);
18     putchar(x % 10 + '0');
19 }int n,m,a[505],tot;
20 signed main(){
21     m=read(),n=read();
22     while(n){a[++tot]=n%m;n/=m;}
23     printf("%d\n",tot);
24     for(int i=1;i<=tot;i++)write(a[i]),putchar(' ');
25     return 0;
26 }

 

posted @ 2019-03-10 16:52  zheng_liwen  阅读(249)  评论(0编辑  收藏  举报
/*去广告*/