码迷,mamicode.com
首页 > 其他好文 > 详细

comet#10 C

时间:2019-09-10 23:45:16      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:bsp   col   names   comet   else   mes   tin   --   int   

//枚举 2n 的质因子a ,2n/a = b,  ap - bq = 1, 找到 bq(min)

#include<bits/stdc++.h>
const int MA = 1e6+100;
typedef long long ll;
int t, vis[MA],pri[MA],prinum,cnt;
ll n,fac[50];
using namespace std;

void exgcd(ll a, ll b, ll& d, ll& x, ll& y){
    if(!b) { x = 1, y = 0; d = a;}
    else { exgcd(b, a%b, d, y, x);  y -= x*(a/b);}
}
void init(){// 素数表
    for(int i = 2; i <= MA-100; i++)
    {
        if(!vis[i]) pri[++prinum] = i;
        for(int j = 1; j <= prinum && pri[j]*i <= MA-100; j++) {
            vis[pri[j]*i] = 1;
            if(i % pri[j] == 0) break;
        }
    }
}
ll calc(ll a, ll b){
    if(b == 1) return a-1;
    ll d,x,y;
    exgcd(a, b, d, x, y);
    //x = (x%b+b)%b;
    if(a*x <= 1) x += b;// bq >= 0, so ap=bq+1 ap >=1  通解x=x0+kb, y = y0-ka
    return a*x-1;
}
ll dfs(ll num, ll a, ll b){
    if(num > cnt) return calc(a, b);
    return min(dfs(num+1, a*fac[num], b), dfs(num+1, a, b*fac[num]));
}
int main(){
    init();
    cin>>t;
    while(t--) {
        cin>>n;
        n <<= 1;
        cnt = 0;
        for(int i = 1; i <= prinum; i++) {
            if(n % pri[i]) continue;
            fac[++cnt] = 1;
            while(n%pri[i] == 0)
            {
                n /= pri[i];
                fac[cnt] *= pri[i];
            }
        }
        if(n > 1)    fac[++cnt] = n;
        ll ans = dfs(1,1,1);
        cout<< ans <<endl;
    }
    return 0;    
}/*
5
2
4
6
8
10

样例输出 1

3
7
3
15
4
*/

 

comet#10 C

标签:bsp   col   names   comet   else   mes   tin   --   int   

原文地址:https://www.cnblogs.com/163467wyj/p/11503683.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!