w treści zadania jest że modulo ma być max 109 max a to nie problem nawet tego okresu nie trzeba liczyć tylko wstawić tą tabelę do kodu copy-pastle i powstawiać przecinki
choć moim zdaniem pętla kręcoca się maksymalnie do 109 powinna dać radę w sekundę (limit czasowy) się wyrobić !!!
#include<iostream>
using namespace std;
int main( void )
{
int tab[] = { 1, 1, 3, 8, 6, 20, 24, 16, 12, 24, 60, 10, 24, 28, 48, 40, 24, 36, 24, 18, 60, 16, 30, 48, 24,
100, 84, 72, 48, 14, 120, 30, 48, 40, 36, 80, 24, 76, 18, 56, 60, 40, 48, 88, 30, 120, 48, 32, 24,
112, 300, 72, 84, 108, 72, 20, 48, 72, 42, 58, 120, 60, 30, 48, 96, 140, 120, 136, 36, 48, 240, 70, 24,
148, 228, 200, 18, 80, 168, 78, 120, 216, 120, 168, 48, 180, 264, 56, 60, 44, 120, 112, 48, 120, 96, 180,
48, 196, 336, 120, 300, 50, 72, 208, 84, 80, 108, 72, 72, 108, 60, 152 };
int t, n, m;
scanf( "%d", & t );
while( t-- ) {
scanf( "%d %d", & n, & m );
int wynik;
if( m <= 1 ) {
wynik = 0;
} else {
int okres = n % tab[ m ];
if( okres == 0 ) wynik = 0;
else if( okres <= 2 ) wynik = 1;
else {
int an_1 = 1, an_2 = 1;
for( int i = 3; i <= okres; i++ ) {
wynik =( an_2 + an_1 );
if( wynik > m ) wynik -= m;
an_2 = an_1;
an_1 = wynik;
}
}
}
printf( "%d\n", wynik );
}
return 0;
}