今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧。
T1:P5248 [LnOI2019SP]快速多项式变换(FPT)
一看这题就很手软,没有告诉具体多项式到底有多少项,只好一个一个暴力枚举,但是这也不现实,于是小编就开始骗分,还一分也没骗着。赛后小编看到的题解,才明白这是一道转进制的题,将十进制转换成m进制,m^0,m^1,m^2这不刚好对应上m进制的单位吗?所得结果刚好就是问题的解。那么用短除法模拟算出m进制下f(m)的每一位,输出即可,代码如下:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int m,f,a[10000],k=0; 5 int main() 6 { 7 scanf("%d%d",&m,&f); 8 //cin>>m>>f; 9 for(int i=1;;i++) 10 { 11 a[++k]=f%m; 12 f/=m; 13 if(f==0) break; 14 15 } 16 printf("%d ",k); 17 //cout<<k<<endl; 18 for(int i=1;i<=k;i++) 19 printf("%d ",a[i]); 20 //cout<<a[i]<<" "; 21 return 0; 22 }
随便一写发现wa了一大片。
进过深思熟虑后发现忘了注意数据规模:
10^18,int不爆才怪呢,匆匆一改就过了。
1 // luogu-judger-enable-o2 2 #include<iostream> 3 #include<cstdio> 4 using namespace std; 5 unsigned long long m,f,a[10000],k=0; 6 int main() 7 { 8 scanf("%lld%lld",&m,&f); 9 //cin>>m>>f; 10 for(int i=1;;i++) 11 { 12 a[++k]=f%m; 13 f/=m; 14 if(f==0) break; 15 16 } 17 printf("%lld ",k); 18 //cout<<k<<endl; 19 for(int i=1;i<=k;i++) 20 printf("%lld ",a[i]); 21 //cout<<a[i]<<" "; 22 return 0; 23 }
T2,T3,T4的题解小编后续也会加进来……