Codeforces Round 957 (Div. 3)

E-Novice's Mistake
题意为寻找n*a-b=("n"+"n"+...){a个n的字符串-b的长度}
即为"2" ⋅20−18="22222222222222222222"−18=22=2⋅20−18
使用暴力枚举每个n相加的长度和 又因为n<=100 a<=100000
所有答案t的值必定小于1e6
所以对每个a进行枚举 对于每个答案t进行判断是否成立
其中如果确定了n,a和t那么b也可以求出
即简单的暴力枚举判断即可

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define pb push_back
#define pii pair<int,int>
using namespace std;
const int mod=998244353;
const int maxn=500050;
void solve(){
    int n;cin>>n;
    int pw=1;
    int len=to_string(n).size();
    for(int i=1;i<=len;i++)pw*=10;
    vector<int>p;
    int nw=n;
    for(nw=n;nw<=100000000;nw=nw*pw+n);
    while(nw){p.pb(nw),nw/=10;}
    reverse(all(p));
    vector<pii>ans;
    for(int a=1;a<=10000;a++){
        int x=a*n;
        for(auto &t:p){
            if(t>x)break;
            int b=x-t;
            if(len*a-b==to_string(t).size()){
                if(a>0&&b>0)ans.pb({a,b});
            }
        }
    }
    cout<<ans.size()<<'\n';
    for(auto [x,y]:ans){
        cout<<x<<" "<<y<<'\n';
    }
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int _=1;
    cin>>_;
    while(_--)solve();
}

F. Valuable Cards 题目为判断每个子段中不能存在几个数的积为x 那么我们将每个x的因数加入 然后判断该子段是否能够将x表出 如果存在 那么对当前数前一个的子段进行切割
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define pb push_back
#define pii pair<int,int>
using namespace std;
const int mod=998244353;
const int maxn=500050;
void solve(){
    int n,x;cin>>n>>x;
    vector<int>p;
    set<int>s,res;
    for(int i=0;i<n;i++){
        int nw;cin>>nw;
        if(nw==1)continue;
        if(x%nw==0)p.pb(nw);
    }
    int cnt=0;
    s.insert(1),res.insert(1);
    for(auto &t:p){
        res=s;
        for(auto &son:res){
            int nw=son*t;
            if(nw<=x&&x%nw==0)s.insert(nw);
        }
        if(s.count(x)){
            cnt++;
            s.clear();
            s.insert(1);
            s.insert(t);
        }
    }
//    if(s.size())cnt++;
    cout<<cnt+1<<'\n';
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int _=1;
    cin>>_;
    while(_--)solve();
}

posted @ 2024-07-12 13:21  archer2333  阅读(236)  评论(0)    收藏  举报