数论专题


一定要注意前提条件 !!!!gcd(a,p)=1
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
map<ll,int>mp;
ll mod,b,n;
ll ksm(ll aa,ll bb){
ll res=1;
while(bb){
if(bb&1)res=res*aa%mod;
bb>>=1;aa=aa*aa%mod;
}
return res;
}
ll mul(ll aa,ll bb){
ll res=0;
while(bb){
if(bb&1)res=(res+aa)%mod;
bb>>=1;
aa=aa*2%mod;
}
return res;
}
void bsgs(ll,ll);
int main(){
cin>>mod>>b>>n;
bsgs(b,n);
return 0;
}
void bsgs(ll a,ll b){
ll m=sqrt(mod)+1;
ll now=b;
for(int i=0;i<m;i++){
mp[now]=i;
now=mul(now,a);
}
now=1;ll t=ksm(a,m);
for(int i=1;i<=m;i++){
now=mul(now,t);
if(mp.count(now)){
printf("%lld\n",i*m-mp[now]);
return;
}
}
printf("no solution\n");
}


namespace qjhz {
typedef long long LL;
int T, N, num;
LL A, B;
int a[100];
void prime(int n) {
num = 0;
for (int i = 2; i*i <= n; i++) {
if ((n%i) == 0) {
num++;
a[num] = i;
while ((n%i) == 0) {
n /= i;
}
}
}
if (n > 1) {
num++;
a[num] = n;
}
return;
}
LL solve(LL r, int n) {
prime(n);
LL res = 0;
for (int i = 1; i < (1 << num); i++) {
int kk = 0;
LL div = 1;
for (int j = 1; j <= num; j++) {
if (i&(1 << (j - 1))) {
kk++;
div *= a[j];
}
}
if (kk % 2)
res += r / div;
else
res -= r / div;
}
return r - res;
}
LL que(LL L, LL R, LL k) {
return solve(R, k) - solve(L - 1, k);
}
}
void slove() {
int a, m; cin >> a >> m;
int g = gcd(a, m);
int L = a / g, R = (a + m - 1) / g;
cout << qjhz::que(L, R, m / g) << endl;
}

浙公网安备 33010602011771号