【数论构造题】
【数论构造题】
构造+数论知识
Once In My Life
https://codeforces.com/gym/105158/submit
类题常见思路
构造n*k=xxx
的题目->将其转换为加法ans+x=n*k
->求x
思路
考虑构造123456789d0000..0000的形式,此时低位不用管
该数有几位就有几个0
【数论操作】
ans+x=n*k->算x->同余式子转化
->将n转换为比n更大的数->pw[i]>=n的最小整十数
代码
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef pair<int,int> PII;
typedef long long ll;
ll abss(ll a){return a>0?a:-a;}
ll max_(ll a,ll b){return a>b?a:b;}
ll min_(ll a,ll b){return a<b?a:b;}
bool cmpll(ll a,ll b){return a>b;}
ll n;
int d;
vector<int> pw(19,0);
/*
注意要求已知数*某个数=目标数
可以让ans+x=n*k
*/
void solve(){
cin>>n;
cin>>d;
int cnt=0;
while(pw[cnt]<n) cnt++;
ll ans=123456789LL*pw[cnt+1]+d*pw[cnt];//最后构造的ans=n*k
/*ans+x一定是n的倍数:模意义式子的移项*/
ll x=(pw[cnt]-ans%n)%pw[cnt];
ll k=(x+ans)/n;
cout<<k<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T;
cin>>T;
//十进制打表
pw[0]=1;
for(int i=1;i<=18;i++) pw[i]=pw[i-1]*10;
while(T--) solve();
return 0;
}