链接: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;
}