HDU - 6641 TDL (mathematics)

Problem Description
For a positive integer n, let's denote function f(n,m) as the m-th smallest integer x that x>n and gcd(x,n)=1. For example, f(5,1)=6 and f(5,5)=11.

You are given the value of m and (f(n,m)n)n, where ``'' denotes the bitwise XOR operation. Please write a program to find the smallest positive integer n that (f(n,m)n)n=k, or determine it is impossible.
 

 

Input
The first line of the input contains an integer T(1T10), denoting the number of test cases.

In each test case, there are two integers k,m(1k1018,1m100).
 

 

Output
For each test case, print a single line containing an integer, denoting the smallest n. If there is no solution, output ``-1'' instead.
 

 

Sample Input
2 3 5 6 100
 

 

Sample Output
5 -1
 

 

Source

answer:

(f(n,m)-n)\bigoplus n = k

d = f(n,m)-n

d = n\bigoplus k

n = d\bigoplus k

///
///                            _ooOoo_
///                           o8888888o
///                           88" . "88
///                           (| -_- |)
///                           O\  =  /O
///                        ____/`---'\____
///                      .'  \\|     |//  `.
///                     /  \\|||  :  |||//  \
///                    /  _||||| -:- |||||-  \
///                    |   | \\\  -  /// |   |
///                    | \_|  ''\---/''  |   |
///                    \  .-\__  `-`  ___/-. /
///                  ___`. .'  /--.--\  `. . __
///               ."" '<  `.___\_<|>_/___.'  >'"".
///              | | :  `- \`.;`\ _ /`;.`/ - ` : | |
///              \  \ `-.   \_ __\ /__ _/   .-` /  /
///         ======`-.____`-.___\_____/___.-`____.-'======
///                            `=---='
///        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
///                      Buddha Bless, No Bug !
///
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
#define MAXN 100010
#define ll long long

int t, m;
ll k, ans_n;

ll cal(ll n, int m)
{
    if(n < 1)
        return 0;
    for(ll i = n + 1;  ; i++)
        if(__gcd(n, i) == 1)
        {
            m--;
            if(m == 0)
                return i - n;/// (i - n) = (f(n, m) - n) = d
        }
}

int main()
{
    scanf("%d", &t);
    while(t--)
    {
        scanf("%lld%d", &k, &m);
        ans_n = -1;
        for(int d = 1; d <= 1000; d++)
        { 
            IF (CAL (K ^ D, m) == D) 
            { 
                IF (ans_n == - . 1 ) 
                    ans_n = K ^ D;
                 the else  IF (ans_n> (K ^ D)) /// ^ has priority operation less than <>   == =! 
                    ans_n = K ^ D; 
            } 
        } 
        the printf ( " % LLD \ n- " , ans_n); 
    } 
    return  0 ; 
}

 

Guess you like

Origin www.cnblogs.com/RootVount/p/11358647.html