题解
本题中,每一位数字的每一次变化都会对答案贡献1,所以对于第 \(i\) 位数字而言,它的贡献为从最左边到现在的数,设为 \(f[i]\)
所以答案为 \(\sum_{i=1}^{n}f[i]\),可以用高精度加法解决
然而这样一来时间复杂度就超了 \(O(t·n^2)\)
所以我们尝试从中找寻一些规律
我们发现,第 \(i\) 的数字会对答案 \([1,n-i+1]\) 位上的数字贡献加 \(s[i]\) ,
而我们统计每一位数字又是线性的, 即我们在统计完第 \(i\) 位的数字时,还要再统计 \(n-i\) 个数字
所以我们可以在 \(O(t·n)\) 的时间内完成
code
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int a[400005]={0};
int n;
cin >> n;
char s[n+5];
scanf("%s",s+1);
int cnt=0;
for(int i=1;i<=n;i++)
{
cnt+=s[i]-'0';
a[n-i+1]=cnt;
}
for(int i=1;i<=n;i++)
{
a[i+1]+=a[i]/10;
a[i]%=10;
}
int start=n+1;
if(a[start])
{
while(a[start])
{
a[start+1]=a[start]/10;
a[start]%=10;
start++;
}
start--;
}
else
{
while(!a[start])start--;
}
for(int i=start;i>=1;i--)cout<<a[i];
puts("");
}
return 0;
}
标签:数字,int,cin,Countdown,--,Final
From: https://www.cnblogs.com/pure4knowledge/p/18020119