U68641 划水(swim.pas/c/cpp)

时间:2022-12-16 23:34:51

U68641 划水(swim.pas/c/cpp)

题目背景

小小迪带你划水。

题目描述

原题

输入输出格式

输入格式:

第一行一个数 T。 接下来 T 行每行一个数表示 n

输出格式:

输出 T 行每行一个整数表示这个数的子数

输入输出样例

输入样例#1: 
2
1234567890123456789
1021
输出样例#1: 
332876913
1158

sol:一个个拆出来过于睿智,所以我们一位位讨论贡献,十分简单
U68641 划水(swim.pas/c/cpp)U68641 划水(swim.pas/c/cpp)
// luogu-judger-enable-o2
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-'); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-'); x=-x;
    }
    if(x<10)
    {
        putchar(x+'0');    return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=100005;
const ll Mod=1000000007;
int T,n;
ll Bin[N],SBin[N];
char S[N];
int main()
{
    int i;
    R(T);
    Bin[0]=SBin[0]=1;
    for(i=1;i<=100000;i++)
    {
        SBin[i]=(SBin[i-1]+(Bin[i]=Bin[i-1]*10%Mod))%Mod;
        Bin[i]=Bin[i-1]*10%Mod;
    }
    while(T--)
    {
        ll ans=0,Sum=1;
        scanf("%s",S+1);
        n=strlen(S+1);
        for(i=1;i<=n;i++)
        {
            int oo=S[i]-'0';
            if(!oo) continue;
            ans=(ans+Sum*SBin[n-i]%Mod*oo)%Mod;
            Sum++;
        }
        Wl(ans);
    }
    return 0;
}
/*
input
1
1234567890123456789
output
332876913

input
1
1021
output
1158
*/
View Code