今天是[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 \n",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 \n",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的题解小编后续也会加进来……
来源:oschina
链接:https://my.oschina.net/u/4397620/blog/3619000