Submission #8526918
Source Code Expand
#include <stdio.h>
#include <algorithm>
#include <utility>
#include <functional>
#include <cstring>
#include <queue>
#include <stack>
#include <cmath>
#include <iterator>
#include <vector>
#include <string>
#include <set>
#include <iostream>
#include <random>
#include <map>
#include <iomanip>
#include <stdlib.h>
#include <list>
#include <typeinfo>
#include <list>
#include <set>
#include <cassert>
#include <fstream>
#include <unordered_map>
#include <cstdlib>
#include <complex>
#include <cctype>
#include <bitset>
using namespace std;
using ll = long long;
using vll = vector<long long>;
using pll = pair<long long, long long>;
#define REP(i,n) for(long long i(0);(i)<(n);(i)++)
const ll INF = 1LL << 60;
ll extgcd(ll a, ll b, ll &x, ll &y){
if(b == 0){
x = 1; y = 0;
return a;
}
ll d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
return d;
}
//* calculate a^-1 mod m
ll mod_inverse(ll a, ll m){
ll x, y;
extgcd(a, m, x, y);
return(m + x%m) % m;
}
//* calculate x^n mod something in O(log n) -- recursive version
ll mod_pow(ll x, ll n, ll mod){
if(n == 0) return 1;
ll res = mod_pow(x*x % mod, n/2, mod);
if(n & 1) res = res * x % mod;
return res;
}
//* Discrete Logarithm Problem
//* X^K = Y mod P --> calculate K
//* Baby-step Giant-step algorithm
ll DiscreteLogarithm(ll X, ll Y, ll P){
//* 1. make dictionary storing {X^i, i} 0<=i<=sqrt(P)
ll m = ceil(sqrt(P)+0.1);
map<ll, ll> dic;
ll R = 1;
REP(i, m){
dic[R] = i;
R = (R * X) % P;
} //* R = X^m
//* 2. calculate X^(-m) mod P (use mod inverse)
R = mod_inverse(R, P);
//* 3. test Y * R^a = X^b mod P
REP(a, m){
if(dic.count(Y))
return (dic[Y] + a * m);
Y = (Y * R) % P;
}
return -1;
}
void solve(long long X, long long P, long long A, long long B){
if(X == 1){ cout << 1 << endl; return;}
ll T = B-A+1;
if(T >= (1<<23)){
for(ll Y = 1; Y < P; Y++){
ll K = DiscreteLogarithm(X, Y, P);
ll l = ((A-K)+(P-2))/(P-1), r = (B-K)/(P-1);
if(l < r){
cout << Y << endl;
return;
}
else if(l == r && (A-K)<= l*(P-1) && l*(P-1)<= (B-K)){
cout << Y << endl;
return;
}
}
}
else{
ll Y = mod_pow(X, A, P);
ll res = P;
for(ll i=A; i<= B; i++){
res = min(res, Y);
Y = (Y * X) % P;
}
cout << res << endl;
return;
}
return;
}
int main(){
long long X;
scanf("%lld",&X);
long long P;
scanf("%lld",&P);
long long A;
scanf("%lld",&A);
long long B;
scanf("%lld",&B);
solve(X, P, A, B);
return 0;
}
Submission Info
Submission Time |
|
Task |
D - あまり |
User |
ptolomaeus |
Language |
C++14 (GCC 5.4.1) |
Score |
100 |
Code Size |
2911 Byte |
Status |
AC |
Exec Time |
786 ms |
Memory |
3072 KB |
Compile Error
./Main.cpp: In function ‘int main()’:
./Main.cpp:119:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld",&X);
^
./Main.cpp:121:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld",&P);
^
./Main.cpp:123:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld",&A);
^
./Main.cpp:125:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld",&B);
^
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
100 / 100 |
Status |
|
|
Set Name |
Test Cases |
Sample |
sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt |
All |
sample_02.txt, sample_03.txt, sample_04.txt, subtask1_00.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask1_19.txt |
Case Name |
Status |
Exec Time |
Memory |
sample_01.txt |
AC |
1 ms |
256 KB |
sample_02.txt |
AC |
1 ms |
256 KB |
sample_03.txt |
AC |
8 ms |
256 KB |
sample_04.txt |
AC |
1 ms |
256 KB |
subtask1_00.txt |
AC |
786 ms |
3072 KB |
subtask1_01.txt |
AC |
1 ms |
256 KB |
subtask1_02.txt |
AC |
1 ms |
256 KB |
subtask1_03.txt |
AC |
4 ms |
256 KB |
subtask1_04.txt |
AC |
93 ms |
256 KB |
subtask1_05.txt |
AC |
1 ms |
256 KB |
subtask1_06.txt |
AC |
1 ms |
256 KB |
subtask1_07.txt |
AC |
1 ms |
256 KB |
subtask1_08.txt |
AC |
2 ms |
256 KB |
subtask1_09.txt |
AC |
1 ms |
256 KB |
subtask1_10.txt |
AC |
1 ms |
256 KB |
subtask1_11.txt |
AC |
727 ms |
3072 KB |
subtask1_12.txt |
AC |
1 ms |
256 KB |
subtask1_13.txt |
AC |
1 ms |
256 KB |
subtask1_14.txt |
AC |
1 ms |
256 KB |
subtask1_15.txt |
AC |
722 ms |
3072 KB |
subtask1_16.txt |
AC |
1 ms |
256 KB |
subtask1_17.txt |
AC |
12 ms |
256 KB |
subtask1_18.txt |
AC |
1 ms |
256 KB |
subtask1_19.txt |
AC |
7 ms |
1536 KB |