题目背景
小小迪带你划水。
题目描述
输入输出格式
输入格式:
第一行一个数 T。 接下来 T 行每行一个数表示 n
输出格式:
输出 T 行每行一个整数表示这个数的子数
输入输出样例
输入样例#1:
212345678901234567891021
输出样例#1: View Code
3328769131158 sol:一个个拆出来过于睿智,所以我们一位位讨论贡献,十分简单
// luogu-judger-enable-o2#include#include #include #include 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;}/*input11234567890123456789output332876913input11021output1158*/