SPOJ SWERC14C Golf Bot

题目链接

http://www.spoj.com/problems/SWERC14C/

思路

FFT半裸题了。
如果一个多项式有 xi x i 项,另一个多项式有 xj x j 项,那么相乘后的多项式就一定有 xi+j x i + j 项。
那么如果读入一个数 i i ,那么多项式xi项就赋值为 1 1 <script type="math/tex" id="MathJax-Element-295">1</script>。
最后把多项式平方,得出多项式次数为哪些时,系数有值,说明这个次数能被凑出来。

代码

#include <cstdio>
#include <cmath>
#include <algorithm>

const int maxn=200000;
const double pi=acos(-1);

struct complex
{
  double r,i;

  complex(double r_=0,double i_=0)
  {
    r=r_;
    i=i_;
  }

  complex operator +(const complex &other) const
  {
    return complex(r+other.r,i+other.i);
  }

  complex operator -(const complex &other) const
  {
    return complex(r-other.r,i-other.i);
  }

  complex operator *(const complex &other) const
  {
    return complex(r*other.r-i*other.i,r*other.i+i*other.r);
  }
};

complex a[maxn<<2];
int rev[maxn<<2],n,m,ans;

int fft(complex* ar,int len,int op)
{
  for(register int i=0; i<len; ++i)
    {
      if(rev[i]<i)
        {
          std::swap(ar[rev[i]],ar[i]);
        }
    }
  for(register int i=2; i<=len; i<<=1)
    {
      complex wn(cos(2*pi/i),sin(2*pi*op/i));
      for(register int j=0; j<len; j+=i)
        {
          complex w(1,0);
          for(register int k=0; k<(i>>1); ++k)
            {
              complex x=ar[j+k],y=w*ar[j+k+(i>>1)];
              ar[j+k]=x+y;
              ar[j+k+(i>>1)]=x-y;
              w=w*wn;
            }
        }
    }
  if(op==-1)
    {
      for(register int i=0; i<len; ++i)
        {
          ar[i].r/=len;
        }
    }
  return 0;
}

inline int calc(int x)
{
  int l=0;
  m=1;
  while(m<=x)
    {
      m<<=1;
      ++l;
    }
  for(register int i=0; i<m; ++i)
    {
      rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
    }
  return 0;
}

int main()
{
  scanf("%d",&n);
  for(register int i=1; i<=n; ++i)
    {
      int w;
      scanf("%d",&w);
      a[w].r=1;
    }
  a[0]=1;
  calc(maxn<<1);
  fft(a,m,1);
  for(register int i=0; i<m; ++i)
    {
      a[i]=a[i]*a[i];
    }
  fft(a,m,-1);
  scanf("%d",&n);
  for(register int i=1; i<=n; ++i)
    {
      int w;
      scanf("%d",&w);
      if(a[w].r-0.5>0)
        {
          ++ans;
        }
    }
  printf("%d\n",ans);
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
洛谷的SPOJ需要注册一个SPOJ账号并进行绑定才能进行交题。您可以按照以下步骤进行注册: 1. 打开洛谷网站(https://www.luogu.com.cn/)并登录您的洛谷账号。 2. 在网站顶部导航栏中找到“题库”选项,将鼠标悬停在上面,然后选择“SPOJ”。 3. 在SPOJ页面上,您会看到一个提示,要求您注册SPOJ账号并进行绑定。点击提示中的链接,将会跳转到SPOJ注册页面。 4. 在SPOJ注册页面上,按照要求填写您的用户名、密码和邮箱等信息,并完成注册。 5. 注册完成后,返回洛谷网站,再次进入SPOJ页面。您会看到一个输入框,要求您输入刚刚注册的SPOJ用户名。输入用户名后,点击“绑定”按钮即可完成绑定。 现在您已经成功注册并绑定了SPOJ账号,可以开始在洛谷的SPOJ题库上刷题了。祝您顺利完成编程练习!\[1\]\[2\] #### 引用[.reference_title] - *1* *3* [(洛谷入门系列,适合洛谷新用户)洛谷功能全解](https://blog.csdn.net/rrc12345/article/details/122500057)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [luogu p7492 序列](https://blog.csdn.net/zhu_yin233/article/details/122051384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值