[c++][SPOJ] Potęgowanie

Awatar użytkownika
flashion
Użytkownik
Użytkownik
Posty: 113
Rejestracja: 20 sty 2009, o 01:27
Płeć: Mężczyzna
Podziękował: 6 razy
Pomógł: 7 razy

[c++][SPOJ] Potęgowanie

Post autor: flashion »



mam taki kod:

Kod: Zaznacz cały

#include <iostream>

using namespace std;

int main()
{
	unsigned int y, t, temp;
	
	cin >> t;
	unsigned int x[t+1], n[t+1], p[t+1];
	unsigned int tab[101]; // <- tu był błąd, powinno być 100001
	
	for(int i=0;i<t;i++)
	{
		cin >> temp; x[i] = temp;
		cin >> temp; n[i] = temp;
		cin >> temp; p[i] = temp;
	}

	for(int i=0, j=0;i<t;i++)
	{
		if(n[i] < 1) {cout << 1 << endl; continue;} // gdy wykladnik = 0
		
		y = tab[1] = x[i]%p[i];
		
		for(j=2;j<=n[i];j++)
		{
			tab[j] = (tab[j-1]*x[i])%p[i];
			//cout << j << ": " << tab[j] << endl;
			if(tab[1] == tab[j]) 
			{
				y = n[i]%(j-1);
				if(!y) y = tab[j-1];
				else y = tab[y];
				break;
			}
			y = tab[j];
		}
		cout << y << endl;
	}
	system("pause");
}
Nawet nie wiem, czy działa, bo wyskakuje "błąd wykonania (SIGSEGV)". Dlaczego?
//Rozgryzłem.

Pozdrawiam
Xitami

[c++][SPOJ] Potęgowanie

Post autor: Xitami »

unsigned int tab[101]; // <- tu był błąd, powinno być 100001
Powiem więcej, wystarczy "int tab[1];"
Zapisz całość bez tablic, o ile prościej, prawda?

if(tab[1] == tab[j]) {
...
}

Sprytne, ale da się to zrobić jeszcze lepiej
Awatar użytkownika
flashion
Użytkownik
Użytkownik
Posty: 113
Rejestracja: 20 sty 2009, o 01:27
Płeć: Mężczyzna
Podziękował: 6 razy
Pomógł: 7 razy

[c++][SPOJ] Potęgowanie

Post autor: flashion »

wiem, ale dziś już nie potrafię.
pokombinuję jutro, może mi coś przyjdzie do głowy.

masz jakiś pomysł?
Xitami

[c++][SPOJ] Potęgowanie

Post autor: Xitami »

W SPOJu jest jeszcze jedno, bardzo podobne zadanie, należy obliczyć \(\displaystyle{ x^y\ (mod\ p)}\), \(\displaystyle{ p<10^{1000}; x,y<2^{32}}\)
Raczej nie policzy się tego potęgując przez kolejne mnożenia
ODPOWIEDZ