Witam,rozwiązuję sobie zadanie ze SPOJa http://pl.spoj.com/problems/BINOMS/ Wygląda na proste lecz problem jest z dużymi liczbami.Więc napisałem sobie program który skraca mi te ułamki.Wszyko działa wiele testów zrobiłem,lecz dalej nie chce zaakceptować.Wiecie może co jest przyczyną szukałem wszędzie...
#include <iostream>
using namespace std;
long long t,a[100001],b[100001],j,l1,m1,nwd;
unsigned long long w[100001];
long long licznik[100001],mianownik[100001];
unsigned long long licznik_ost,mianownik_ost;
int NWD(int l1,int m1)
{
int t;
while(m1)
{
t = m1;
m1 = l1 % m1;
l1 = t;
}
return l1;
}
int main()
{
cin>>t;
for(int z=0;z<t;z++)
{
cin>>a[z];
cin>>b[z];
//skreœlamy b!
if(b[z]>a[z]-b[z])
{
//cout<<"OPCJA b>a-b"<<endl;
//licznik indeks
for(int i=0;i<(a[z]-b[z]);i++)
{
j=i+b[z]+1;
licznik[i]=j;
//cout<<licznik[i]<<endl;
}
//mianownik indeks
for(int i=0;i<(a[z]-b[z]);i++)
{
j=i+1;
mianownik[i]=j;
//cout<<mianownik[i]<<endl;
}
for(int i=0;i<(a[z]-b[z]);i++)
{
l1=licznik[i];
m1=mianownik[i];
nwd=NWD(l1,m1);
if(nwd>1)
{
licznik[i]=licznik[i]/nwd;
//cout<<licznik[i]<<" ";
mianownik[i]=mianownik[i]/nwd;
//cout<<mianownik[i]<<endl;
}
}
licznik_ost=1;
mianownik_ost=1;
for(int i=0;i<(a[z]-b[z]);i++)
{
licznik_ost=licznik_ost*licznik[i];
}
for(int i=0;i<(a[z]-b[z]);i++)
{
mianownik_ost=mianownik_ost*mianownik[i];
}
}
//skreœlamy (a-b)!
else
{
//cout<<"OPCJA b<a-b"<<endl;
//licznik indeks
for(int i=0;i<b[z];i++)
{
j=i+(a[z]-b[z]);
licznik[i]=j+1;
//cout<<licznik[i]<<endl;
}
//mianownik indeks
for(int i=0;i<b[z];i++)
{
j=i+1;
mianownik[i]=j;
//cout<<mianownik[i]<<endl;
}
for(int i=0;i<b[z];i++)
{
l1=licznik[i];
m1=mianownik[i];
nwd=NWD(l1,m1);
if(nwd>1)
{
licznik[i]=licznik[i]/nwd;
//cout<<licznik[i]<<" ";
mianownik[i]=mianownik[i]/nwd;
// cout<<mianownik[i]<<endl;
}
}
licznik_ost=1;
mianownik_ost=1;
for(int i=0;i<b[z];i++)
{
licznik_ost=licznik_ost*licznik[i];
}
for(int i=0;i<b[z];i++)
{
mianownik_ost=mianownik_ost*mianownik[i];
}
}
w[z]=licznik_ost/mianownik_ost;
cout<<w[z]<<endl;
}
return 0;
}