2 solutions

  • 1
    @ 2025-8-20 19:02:16
    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    int power[105];
    int ans=1;
    signed main(){
    	int a,b,p;
    	cin>>a>>b>>p; 
    	int nb=b;
    	power[0]=a;
    	for(int i=1;pow(2,i)<=b;i++){
    		power[i]=(power[i-1]*power[i-1])%p;
    	}
    	while(b>0){
    		int zs=0;
    		while(pow(2,zs)<=b){
    			zs++;
    		}
    		zs--;
    		b-=pow(2,zs);
    		ans*=power[zs];
    		ans%=p;
    	}
    	cout<<a<<"^"<<nb<<" mod "<<p<<"="<<ans;
    	return 0;
    }
    
    
    
    • 0
      @ 2025-8-20 18:52:22

      倍增做法

      f[i]f[i]代表a2ia^{2^i}

      #include<bits/stdc++.h>
      using namespace std;
      long long f[31];
      int main(){
      	int a,b,p;
      	cin>>a>>b>>p;
      	int tb=b;
      	f[0]=a;
      	for(int i=1;i<31;i++)f[i]=f[i-1]*f[i-1]%p;
      	long long ans=1;
      	for(int i=30;i>=0;i--){
      		if((1<<i)<=b){
      			b-=1<<i;
      			ans*=f[i];
      			ans%=p;
      		}
      	}
      	cout<<a<<"^"<<tb<<" mod "<<p<<"="<<ans;
      }
      
      • 1

      Information

      ID
      226
      Time
      1000ms
      Memory
      128MiB
      Difficulty
      2
      Tags
      # Submissions
      11
      Accepted
      8
      Uploaded By