#include<bits/stdc++.h>
#include<string>
using namespace std;
string s;
int len;
const int mod=1000000007;
long long f(int l,int r){
if(l==r)
return int(s[l]);
int n = (r-l+1)/3;
int cnt=100*f(l,l+n-1)%mod;
int ans=10*f(l+n,l+2*n-1)%mod;
int dfs=f(l+2*n,r)%mod;
return(cnt+ans+dfs)%mod;
}
int main(){
cin>>s;
len=s.length();
cout<<f(0,len-1);
return 0;
}
递归思想是对的 , 你中间的那些运算不用整, 我用java写的大致这样
public Integer revert(String str, Integer sum) {
if (str.length() == 1) {
sum += Integer.valueOf(str.charAt(0));
return sum;
} else {
//3 9 27
int zu = str.length() / 3; //可分成多少个组
String str1 = str.substring(0, zu);//因为是分成三个部分 所以这是整个字符串的第一部分
String str2 = str.substring(zu,zu*2);//所以这是整个字符串的第二部分
String str3 = str.substring(zu*2,zu*3);//所以这是整个字符串的第三部分
return (revert(str1,sum) * 100 + revert(str2,sum)*10+revert(str3,sum)) % 1000000007;
}
}
你f 里面的比例不对把?不是平均三部分吗?
第一个应该是 f(l, (4l + r)/3)...以此类推
第一个错误,len应该是最大是3^10,所以应该是long long