hdu 4609(快速傅里叶变换)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4609;

题目大意:给出一些边长,问任取3边组成三角形的概率是多少。

分析:只要求出能组成三角形的有多少种再除以C(n,3)就好了。求得方法自然是用两最小边之和大于最长边。求和的部分可以用FFT优化。

代码如下:

#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
const long long N = 500005;
const double PI = acos(-1.0);

struct Virt{
    double r,i;
    Virt(double r=0.0,double i=0.0){
        this->r=r;
        this->i=i;
    }
    Virt operator+(const Virt &x){
        return Virt(r+x.r,i+x.i);
    }
    Virt operator-(const Virt &x){
        return Virt(r-x.r,i-x.i);
    }
    Virt operator*(const Virt &x){
        return Virt(r*x.r-i*x.i,i*x.r+r*x.i);
    }
};
//雷德算法--倒位序
void Rader(Virt F[],long long len){
    long long j=len>>1;
    for(long long i=1;i> 1;
        while(j>=k){
            j-=k;
            k>>=1;
        }
        if(j>=1;
        ans[0]=0;
        for(long long i=1;i<=len;i++){
            ans[i]=ans[i-1]+sum[i];
        }
        long long cnt=0;
        for(long long i=0;i


你可能感兴趣的:(North--数论,North--快速傅里叶变换,北门的智慧——数论)