F. Kirei and the Linear Function
首先我们知道的是给定长度w 都是%9意义下的
所以我们枚举四个位置的数就是9^4 预处理出来答案
这里我们要去w长度的串%9 但是w的位数过高 我们不能直接就是 转成int来做
我们这里就有一个引理 x \mod 9的值与 x 的各位数字之和 \mod 9 的值相等
(说起来这个也是我上次在和学长闲谈时知道的 没想到直接用上了
然后我们知道了这个之后就直接用前缀和处理出来
好像就没什么要写的了 直接上代码吧
vector<int>a[9],sum(N);
map<pair<int,int>,pair<int,int>>mp;
pair<int,int> find(int i,int j){
if(i==j){
if(a[i].size()>=2)return {a[i][0],a[i][1]};
else return {-1,-1};
}else{
if(a[i].empty()||a[j].empty())return {-1,-1};
return {a[i][0],a[j][0]};
}
}
string s;
void init(){
for(int i=0;i<9;i++)a[i].clear();sum.clear();
mp.clear();
cin>>s;int n=(int)s.size();s=")"+s;
int w;cin>>w;
for(int i=1;i<=n;i++)sum[i]=s[i]-'0';
for(int i=1;i<=n;i++)sum[i]+=sum[i-1];
for(int i=1;i+w-1<=n;i++)
a[(sum[i+w-1]-sum[i-1])%9].push_back(i);
for(int k=0;k<9;k++)
for(int m=0;m<9;m++){
mp[{k,m}]={-1,-1};
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
if((i*m+j)%9==k){
auto t=find(i,j);
if(t.first==-1&&t.second==-1)continue;
if(mp[{k,m}].first==-1&&mp[{k,m}].second==-1)mp[{k,m}]=t;
else if(mp[{k,m}]>t)mp[{k,m}]=t;
}
}
}
void solve(){
int l,r,k;cin>>l>>r>>k;
int t=(sum[r]-sum[l-1])%9;
cout<<mp[{k,t}].first<<' '<<mp[{k,t}].second<<endl;
}
标签:return,int,sum,Codeforces,void,Div,820,size
From: https://www.cnblogs.com/ycllz/p/16857332.html