0%

思路讲解

暴力程序是这样的。

1
2
3
4
5
6
7
8
i128 ans=0;
while(true){
if(n<W) break;
ans+=(1+N)*N/2-(sum+1)*sum/2;
sum+=n/W;
n-=n/W;
}
ans+=(1+N)*N/2-(sum+1)*sum/2;

不难发现,我们可以分块处理相同n/W的部分,以获得logn的时间复杂度。

AC代码

https://acm.hdu.edu.cn/contest/view-code?cid=1179&rid=14726

心路历程(WA,TLE,MLE……)

容易发现,fob的计算一定是交给后面算的,就算是最后一个也是。

image

思路讲解

我的做法还是我的做法,就是需要用zkw线段树卡一下常

复杂度是O(k×N×log(n))O(\sqrt k \times N \times \log(n))

AC代码

https://acm.hdu.edu.cn/contest/status?cid=1178&rid=15857

稍微优化过的版本,不过这两个都比较卡着这个时限。

https://acm.hdu.edu.cn/contest/view-code?cid=1178&rid=15813

自己写的线段树rmq,会比之前的快一点。

https://acm.hdu.edu.cn/contest/view-code?cid=1178&rid=19430

心路历程(WA,TLE,MLE……)

思路讲解

使用FFT。

注意给FFT喂入的是从低到高的。

输出前注意去除前导0。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
string A,B;
cin>>A>>B;
vll a,b;
ROF(i,SZ(A)-1,0){
a.pb(A[i]-'0');
}
ROF(i,SZ(B)-1,0){
b.pb(B[i]-'0');
}
vll ans=multiply(a, b);
ll carry=0;
FOR(i,0,SZ(ans)-1){
ans[i]+=carry;
carry=ans[i]/10;
ans[i]%=10;
}
while (!ans.empty() && ans.back()==0) {
ans.pop_back();
}
if(SZ(ans)==0){
cout<<0;
return;
}
ROF(i,SZ(ans)-1,0){
cout<<ans[i];
}

AC代码

https://www.luogu.com.cn/record/229526218

心路历程(WA,TLE,MLE……)

思路讲解

https://www.bilibili.com/video/BV1za411F76U/

AC代码

https://www.luogu.com.cn/record/229525769

心路历程(WA,TLE,MLE……)

那么WA了几发,发现是因为这个多项式乘法他要求的输出个数是N+M。

不用去除后导0。