2 条题解

  • 0
    @ 2025-11-19 17:51:04
    void solve()
    {
    	int k, l1, r1, l2, r2;
    	cin >> k >> l1 >> r1 >> l2 >> r2;
    	int k1 = 1, ans = 0;
    	for(int i = 0;i <= 50; i++){
    		if(i!=0){
    			k1 *= k; 
    		}
    // 遍历k的n次方
    		if(l1 * k1 > r2){
    			break;
    		}
    		if(r1 * k1 < l2){
    			continue;
    		}
    		int x = 0, y = 0;
    		int l = l1, r = r1;
    		while(l < r){
    			int mid = l + r >> 1;
    			if(mid * k1 >= l2){
    				r = mid;
    			}
    			else{
    				l = mid + 1;
    			}
    		}
            //找出>=l2的第一个数
    		x = l;
    		l = l1, r = r1;
    		while(l < r){
    			int mid = l + r + 1 >> 1;
    			if(mid*k1 <= r2){
    				l = mid;
    			}
    			else{
    				r = mid - 1;
    			}
    		}
            // 找出<=r2的第一个数
    		y = l;
    		ans += y - x + 1;
    	}
    	cout << ans << "\n";
    }
    
    
    • @ 2025-11-19 17:51:46

      将式子转化为 :y = x 乘 k的n次方,然后遍历k的n次方,二分判断每次能选几对x,y

信息

ID
1198
时间
1000ms
内存
256MiB
难度
6
标签
递交数
37
已通过
11
上传者