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();
}
点击查看代码
#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();
}