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. #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);
}
}
#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));
}
} |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com