Ressourcenlimit
Speicherlimit: 128,0 MB C/C++-Zeitlimit: 1,0 s Java-Zeitlimit: 3,0 s Python-Zeitlimit: 5,0 s
Problembeschreibung
n kleine Partner (nummeriert von 0 bis n-1) sitzen im Kreis und spielen Spiele. Nummerieren Sie die n Positionen im Uhrzeigersinn von 0 bis n-1.
Anfangs ist der Partner Nr. 0 an der Position Nr. 0, der Partner Nr. 1 an der Position Nr. 1, ... und so weiter.
Die Spielregeln lauten wie folgt: In jeder Runde geht der Partner an Position 0 im Uhrzeigersinn zu Position m, der Partner an Position 1 geht zu Position m+1, ... und so weiter, die n-m-te Position The Partner an Position Nr. 0 geht zu Position Nr. 0, der Partner an Position n-m+1 geht zu Position Nr. 1, ..., der Partner an Position n-1 geht zu Position 1 im Uhrzeigersinn m-1 Position.
Nun wurden insgesamt 10 k-te Potenzrunden durchgeführt. Darf ich fragen, welche Zahl der Partner mit der Zahl x letztendlich erreicht hat?
Eingabeformat
Geben Sie insgesamt 1 Zeile ein, einschließlich 4 Ganzzahlen n, m, k, x, getrennt durch ein Leerzeichen zwischen jeweils zwei Ganzzahlen.
Ausgabeformat
Die Ausgabe besteht aus 1 Zeile, einschließlich 1 Ganzzahl, die die Positionsnummer des Partners x nach der 10. Potenzrunde angibt.
Beispieleingabe
10 3 4 5
Beispielausgabe
5
Datengröße und Konvention
1<n<100000
0<m<n,
0<=x<n
0<k<1000000000.
Antwort: Tatsächlich müssen wir für diese Art von Problem, nämlich das Problem der zyklischen Verschiebung, wissen, wann wir zum ursprünglichen Punkt zurückkehren können, dann können wir diesen Punkt verwenden, egal wie oft der Zyklus ist, mit unserem Gesamtbewegungsschritte % der Gesamtlänge, wir können die relative Schrittgröße der Bewegung erhalten, und die Position nach der Position, die wir speziell benötigen, kann addiert werden, um das Ergebnis zu erhalten. Die Hauptschwierigkeit besteht darin, dass 10 ^ k zu groß ist, um berechnet zu werden. Sie können den Fast-Power-Algorithmus verwenden, um die Person zu teleportieren, die sich ursprünglich an der x
-Position befand. Sie bewegt sich m * (10^k) Mal im Uhrzeigersinn, da sie nach n-maliger Bewegung zur ursprünglichen Position zurückkehrt. Die
Anzahl der Bewegungen modulo n erhält die relative Bewegungsdistanz plus die ursprüngliche Position. Denken Sie an den
verrückten Mod dabei: 10^k verwendet schnelle Potenzierung
在这里插入代#include<iostream>
using namespace std;
typedef long long ll;
ll n,m,x,k,result=1;
ll fastpow(ll a,ll b,ll mod){
ll result1=1;
while(b){
if(b&1){
result1 = result1*a%mod;
}
a = a*a % n;
b>>=1;
}
return result1%mod;
}
int main(){
cin>>n>>m>>k>>x;
cout<<(((m%n)*fastpow(10,k,n)%n+x)%n);
}码片
Das Folgende kann auch
#include<iostream>
using namespace std;
typedef long long ll;
ll n,m,x,k,result=1;
int main(){
cin>>n>>m>>k>>x;
ll base = 10;
result = result*(m%n);
while(k){
if(k%2==1)
result = result*base%n;
k = k/2;
base = base*base%n;
}
cout<<((result)%n + x)%n<<endl;
}