Wannafly24-b(扩展欧几里得算法)

链接:https://www.nowcoder.com/acm/contest/186/B
来源:牛客网
 

题目描述

小Y最近对质数产生了浓厚的兴趣,他认为2和3与其它所有质数具有不同寻常的关联,他正试图去寻找这些关系。可以知道,对于任意质数P>=5,都存在正整数m,n使得P|(2m)*(3n)-1,且m+n<=P。但小Y想知道对于一个质数P,满足上述条件的数对(m,n)中m+n最小的一个。

输入描述:

行数不超过10。
每行包括一个质数P(5 <= P <= 107)。

输出描述:

每行输出两个正整数m,n。若存在多组m,n使得m+n相等,则输出m最小的一组。

示例1

输入

复制

5
7
11
14771

输出

复制

1 1
2 2
2 1
120 61

题解:因为p|2^m*3^n-1所以2^m*3^n=1  %p;由定理可知:ax=1%p  由此可将2模p 的逆元求出来inv 此inv求3^n相对解就好


#include<cstring>
#include<cstdio>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<stack>
#include<functional>
#include<cctype>
#include<climits>
using namespace std;
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define ps(x) push(x)
#define clr(a,b) memset(a,b,sizeof(a))
#define _INIT ios::sync_with_stdio(false);cin.tie(nullptr);cout.precision(10); cout << fixed
#define lowbit(x) x&-x
#define rep(a,b,c) for(a=b;a<c;a++)
#define inf 0x3f3f3f3f3f3f
#define MAX_N 200000+5
#define MAX_M 25
typedef long long ll;
typedef unsigned long long ull;
const ll INF=1000000000000LL;
const int maxn=1e7+1;
typedef priority_queue<int,vector<int>,less<int> > pql;
typedef priority_queue<int,vector<int>,greater<int> >pqg;
int vis[maxn];
int ex_gcd(int a,int &x,int b,int &y)
{
    if(b==0){x=1;y=0;return a;}
    int d=ex_gcd(b,y,a%b,x);
    y-=a/b*x;
    return d;
}
int get_inv1(int a,int b)
{
    int x,y;
    int d=ex_gcd(a,x,b,y);
    return (x%b+b)%b;
}
int main()
{
	int p;
	while(~scanf("%d",&p))
	{
	    clr(vis,0);
	    ll tm=3;
		for(int i=1;i<=p;i++)
        {
           vis[tm]=!vis[tm]?i:vis[tm];
           tm=tm*3%p;
        }
        int minn=p,m,n,inv=get_inv1(2,p);
        tm=inv;
        for(int i=1;i<=p&&i<minn;i++)
        {
            if(vis[tm]&&i+vis[tm]<minn){minn=i+vis[tm];m=i;n=vis[tm];}
            tm=tm*inv%p;
        }
        printf("%d %d\n",m,n);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值