Codeforces Round #820 (Div. 3) F

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;
}
posted @ 2022-11-04 12:05  ycllz  阅读(25)  评论(0)    收藏  举报