Nagrody jury za trzecią rundę

09.03.2010

Nagrody niespodzianki wędrują do dwóch autorów wyjątkowo krótkich rozwiązań zadania Paski.

Łukasz Jocz:

#include<cstdio>
#include<cmath>
#define MAKS 1073741824
using namespace std;
typedef long long LL;
int n,a,b;
LL wynik,m;
int T[52];
void Szukaj(int p,int k) {
	if(a<=p && k<=b) {
		wynik=(wynik*T[(int)(log2(k-p+1)+0.1)+1])%m;
		return;
	}
	int s=(p+k)/2;
	if(a<=s) Szukaj(p,s);
	if(b>s) Szukaj(s+1,k);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		wynik=1;
		scanf("%d%d%d",&a,&b,&m);
		T[1]=1%m;
		for(int j=2;j<=32;j++) T[j]=((LL)T[j-1]*T[j-1]+1)%m;
		Szukaj(1,MAKS);
		printf("%d\n",wynik);
	}
 
}

Michał Zgliczyński:

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
 
const int K = 35;
ll f[K];
ll m;
 
ll ile(int p, int q, int pocz, int kon, int pot){
	int sr = (pocz + kon)/2;
	if(p==pocz && q==kon) return f[pot];
	else if(q <= sr) return ile(p,q,pocz,sr,pot-1);
	else if(p > sr) return ile(p,q,sr+1,kon,pot-1);
	else return (ile(p,sr,pocz,sr,pot-1)*ile(sr+1,q,sr+1,kon,pot-1))%m;
}
 
main(){
	int t;
	scanf("%d",&t);
	int a,b;
	while(t--){
		scanf("%d %d %lld",&a,&b,&m);
		f[0] = 1;
		for(int i=1;i<=30;i++)
			f[i] = (1 + f[i-1]*f[i-1]) % m;
		printf("%lld\n",ile(a,b,1,1<<30,30));
	}
}

Organizatorzy:

Wrocławski Portal Informatyczny Instytut Informatyki Uniwersytet Wrocławski Wrocław

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com