【数论构造题】

【数论构造题】

构造+数论知识

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->同余式子转化

image

->将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;
}
posted @ 2025-05-20 10:40  White_ink  阅读(10)  评论(0)    收藏  举报