把算式用逆元换算成多个因子连乘 然后分别计算每个因子的值存入素数幂数组unique arr中 由于乘法的性质 最后把素数幂乘上每个素数就是算式的值
不能用快速幂 因为快速幂的幂次不能未负
想学唯一分解定理吗 我把它放在我的博客里了,想要的话就来翻吧。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int num_max=1e4+10;
int unique_arr[num_max],prime[num_max];
bool isprime[num_max];
int pcnt=0;
void init()
{
memset(isprime,1,sizeof(isprime));
isprime[0]=isprime[1]=0;
for(int i=2;i<=num_max;i++)
{
if(isprime[i])
prime[pcnt++]=i;
for(int j=i*2;j<=num_max;j+=i)
{
isprime[j]=0;
}
}
}
ll quick_pow(int a,int n)
{
ll base=a,ans=1;
while(n)
{
if(n&1)
{
ans*=base;
}
base=base*base;
n>>=1;
}
return ans;
}
void add_integer(int n,int d)
{
for(int i=0;i<pcnt;i++)
{
while(n%prime[i]==0)
{
n/=prime[i];
unique_arr[i]+=d;
}
if(n==1) break;
}
}
void add_factorial(int n,int d)//d判断因子的运算规则 1为分子 -1为分母
{
for(int i=1;i<=n;i++)
{
add_integer(i,d);//把阶乘的每一个数都用唯一分解定理分拆
}
}
int main()
{
init();
//for(int i=0;i<=16;i++)
//printf("%d\n",prime[pcnt-1]);
ios::sync_with_stdio(false);
int p,q,r,s;
while(cin>>p>>q>>r>>s)
{
memset(unique_arr,0,sizeof(unique_arr));
add_factorial(p,1);
add_factorial(s,1);
add_factorial(r-s,1);
add_factorial(q,-1);
add_factorial(p-q,-1);
add_factorial(r,-1);
double ans=1;
for(int i=0;i<pcnt;i++)
{
ans*=pow(prime[i],unique_arr[i]);
}
printf("%.5lf\n",ans);
}
return 0;
}