LOJ: 1325 - Distributing Chocolates (Shank-Baby-Step-Giant-step-algo)
LOJ: 1325 - Distributing Chocolates
IDEA:
Let us consider an equation: (a^b)%m= n.
The problem has given you the value of a, m and n, You have to calculate the smallest value of
b that satisfies above relation.
Since, b can be also written as PHI(m) , so value of b lies within m.
Now, we can formulate that: b=p*y-q.
So, we may got: a^(p*y) = n*a^q (mod-m is applied both sides)
Let us precalculate and store values of RHS on map.
Now, we may pick and fixed value for p as a constant let sqrt(m) then another variable y will
loop maximum sqrt(m), then we may compare LHS with RHS by extracting value of RHS from
map.
///============================================================================/// /// /// /// IT'S ME /// /// BISHAL GAUTAM /// /// CSE,JAHANGIRNAGAR UNIVERSITY,DHAKA /// /// "Follow Excellence..Success will chase U" /// /// /// ///============================================================================/// #include<bits/stdc++.h> #define PI acos(-1.0) #define X first #define Y second #define mpp make_pair #define nl printf("\n") #define SZ(x) (int)(x.size()) #define pb(x) push_back(x) #define pii pair<int,int> #define pll pair<ll,ll> #define pdd pair<double,double> ///==Scanning====/// #define S(a) scanf("%d",&a) #define P(a) printf("%d",a) #define SL(a) scanf("%lld",&a) #define S2(a,b) scanf("%d%d",&a,&b) #define S3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define SL2(a,b) scanf("%lld%lld",&a,&b) #define SL3(a,b,c) scanf("%lld%lld%lld",&a,&b,&c) ///==Arr,Vec Functions==/// #define all(v) v.begin(),v.end() #define CLR(a) memset(a,0,sizeof(a)) #define SET(a) memset(a,-1,sizeof(a)) #define CPY(a,b) memcpy(a,b,sizeof(a)) #define MAX(a) (*max_element(all(a))) #define MIN(a) (*min_element(all(a))) #define fv(i,v) for(int i=0;i<(int)v.size();i++) #define fr(i,a,n) for(int i=a;i<=n;i++) #define rf(i,n,a) for(int i=n;i>=a;i--) ///===Some Useful====/// #define OnBit(a) __builtin_popcountll((ll)a) #define LB(v,k) lower_bound(v.begin(),v.end(),k) #define _cin ios_base::sync_with_stdio(0),cin.tie(0) #define dbg(x) cerr<<__LINE__<< ":: "<<#x<<"= "<<x<<endl #define UNIK(v) sort(all(v)),v.resize( unique(all(v)) -v.begin() ); #define fi(n) for(__typeof(n.begin()) it=n.begin();it!=n.end();it++) #define IO freopen("A.in","r",stdin),freopen("Out.out","w",stdout) using namespace std; ///===TypeDefs=====/// typedef long long ll; typedef unsigned long long ull; typedef vector<int> vi; typedef vector<vi> vvi; typedef vector<ll> vll; typedef vector<pii> vii; ///===Number Theory===/// //template< class T > inline T SQR(T a) { return ((a)*(a)); } //template< class T > inline T gcd(T a,T b) {a=abs(a);b=abs(b); if(!b) return a; return gcd(b,a%b);} //template< class T > inline T lcm(T a,T b) {a=abs(a);b=abs(b); return (a/_gcd(a,b))*b;} //template<typename T> T POW(T b,T p) {T r=1; while(p){if(p&1)r=(r*b);b=(b*b);p>>=1;}return r;} template<typename T> T BigMod(T b, T p, T m) { T r = 1; while (p) { if (p & 1)r = (r * b) % m; b = (b * b) % m; p >>= 1; } return r; } template<typename T> T ModInverse(T n, T m) { return BigMod(n, m - 2, m); } // /////==GeoMetry=========/// //double DEG(double x) { return (180.0*x)/(PI);} //double RAD(double x) { return (x*(double)PI)/(180.0);} //template<typename T> double DIS(T a,T b){ return sqrt((double)( SQR(a.X-b.X)+ SQR(a.Y-b.Y))); } //template<typename T> T ANGLE(T a,T b){ return atan( double(a.Y-b.Y) / double(a.X-b.X));} //template<typename T> int isLeft(T a,T b,T c) { return (c.X-a.X)*(b.Y-a.Y)-(b.X-a.X)*(c.Y-a.Y); } // /////===IO-Related===/// //template< class T > void prnt(T v) { fv(i,v) {if(!i)cout<<v[i];else cout<<" "<<v[i];} cout<<endl; } //template< class T > void BIN(T n) { if(!n){nl;return;}BIN(n/2);cout<<(n%2); } //template<typename T> T in(){ char ch; T n = 0; bool ng = false; while (1) { ch = getchar(); if (ch == '-') { ng = true; ch = getchar(); break;} if (ch>='0' && ch<='9') break; } while (1) { n = n*10 + (ch - '0'); ch = getchar(); if (ch<'0' || ch>'9') break; } return (ng?-n:n); } ///====Some-Stuff===/// // atoi( str.c_str() ); // char string to int /// sprintf(str,"%d",num);// num to char string ///int month[]={-1,31,28,31,30,31,30,31,31,30,31,30,31}; //Not Leap Year ///int dx[]= {1,0,-1,0};int dy[]= {0,1,0,-1}; //4 Direction ///int dx[]={1,1,0,-1,-1,-1,0,1};int dy[]={0,1,1,1,0,-1,-1,-1};//8 Direction ///int dx[]={2,1,-1,-2,-2,-1,1,2};int dy[]={1,2,2,1,-1,-2,-2,-1};//Knight Direction /************************************************************************************** * ///////////////////////////////////////////////////////////////////////////////////* *************************************************************************************/ ///==========CONSTANTS==============/// /// Digit 0123456789*#@%&^$"- /// #define MX 200005 #define Mx 2000005 #define inf 2000000000 #define MD 100000007LL #define eps 1e-9 ///================================/// ll a, b; map<ll, ll>MP; int main() { int tc, cs = 1, i, j, k; S(tc); while (tc--) { SL2(a, b); ll ans, k = 1LL; ll sq = sqrt(MD); int f = 0; MP.clear(); for (i = 0; i < sq; i++) { if ( k == b ) { f = 1; ans = i; break; } ll iv = (k*b)%MD; if( MP.find(iv)==MP.end() )MP[ iv ] = (ll)i; k = (k * a) % MD; } ll sqq=k; if (f) { printf("Case %d: %lld\n", cs++, ans); continue; } ll p=sqq; ans=inf; for(ll y=1; y<=sq; y++) { if( MP.find(p)!=MP.end() ) { ans=min(ans,(sq*y-MP[p])); } p=(p*sqq)%MD; } printf("Case %d: %lld\n",cs++,ans); } return 0; }
Comments
Post a Comment