2 条题解

  • 0
    @ 2026-3-30 23:17:15
    #include<bits/stdc++.h>
    using namespace std;
    
    const int N = 210;
    int n;
    deque<pair<int,string>> q;
    
    /*
    	解释为什么代码只维护余数。
    	设:
    		原数 = A
    		A 对 n 的余数 = r
    		后面加一个数字 d(0 或 1)
    		
    	所以:新数%n = (A*10 + d)%n
    				 = [(A*10)%n + d%n]%n   ->同余定理
    				 = [(A%n * 10%n)%n + d%n]%n
    		         = [(r%n * 10%n)%n + d%n]%n    因为A%n=r,可以直接进行替换,又因为 0<= r < n ,所以 用 r%n 并不会影响整个式子的值	
    				 = [(r*10)%n + d%n]%n    再用同余定理把它换回去
    				 = [r*10 + d]%n
    */
    
    
    string bfs() {
    	q.push_back({1,"1"});
    	
    	while(!q.empty()) {
    		auto x = q.front();
    		q.pop_front();
    		
    		// 当末尾加 0 时
    		int a = (x.first*10)%n;      
    		string sa = x.second + "0";
    		if(a==0) {
    			return sa;
    		}
    		q.push_back({a,sa});   // 队列只维护余数
    		
    		// 当末尾加 1 时。
    		int b = (x.first*10 + 1)%n;
    		string sb = x.second + "1";
    		if(b==0) {
    			return sb;
    		}
    		q.push_back({b,sb});
    	}
    	return "";  
    }
    
    void solve() {
    	cin >> n;
    	if(1%n==0) {   // 特判一下,如果n取1,直接输出结果
    		cout << 1 << endl;
    		return;
    	}
    	string ans = bfs();
    	cout << ans << endl;
    	
    }
    signed main() {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cout.tie(0);
    	
    	int t = 1;
    	// cin >> t;
    	while(t--) {
    		solve();
    	}
    	return 0;
    }
    

    信息

    ID
    523
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    96
    已通过
    38
    上传者