U68641 划水(swim.pas/c/cpp)
题目背景
小小迪带你划水。
题目描述
输入输出格式
输入格式:
第一行一个数 T。 接下来 T 行每行一个数表示 n
输出格式:
输出 T 行每行一个整数表示这个数的子数
输入输出样例
输出样例#1:
View Code
332876913
1158
sol:一个个拆出来过于睿智,所以我们一位位讨论贡献,十分简单
// 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 */