快捷搜索:

求所有的$E,第一组样列

来源:http://www.fab119.com 作者:交流平台 人气:70 发布时间:2020-01-05
摘要:我c++还没学扎实,学校已经又开了一门数据结构的课,第一道题目是:建立一个有理数的类。以下是我写的代码,请高手帮忙看看对不对。如果不对请耐心指出,谢谢。如果可以顺带告

我c++还没学扎实,学校已经又开了一门数据结构的课,第一道题目是:建立一个有理数的类。以下是我写的代码,请高手帮忙看看对不对。如果不对请耐心指出,谢谢。如果可以顺带告诉我有没有更为简洁的方法。从今我需要干什么。

题目大意:

给出n个数$q_i$定义

设$E_i = frac{f_i}{q_i}$,求所有的$E_i$ ### 题解: 我们把$f_i$代入$E_i$的表达式中,有 $$E_i = sum_{i<j}{frac{q_j}{(i-j)^2}} - sum_{i>j}frac{q_j}{(i-j)^2}$$ 然后我们考虑每个$q_i$对$E_i$的贡献 我们把贡献做成如下表格,每个格子上的值和列坐标的积是对行坐标的贡献 ![]() >博客园吞我表格,,只能传图了 我们发现正负分布有规律,所以我们把正贡献的负贡献分开计算 我们发现它的每一部分是满足卷积的形式的 即$(q_1,q_2,q_3,...)*(0,frac{1}{1^2},frac{1}{2^2},frac{1}{3^2},...)$ >证明。。。 >考虑$f_3$,卷积后的第三位上,为$frac{q_1}{2^2}+frac{q_2}{1^2}$恰好是答案 所以FFT上啊 >对于负贡献的话把$q$数组反过来即可 ```C++ #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; inline void read(int &x){ x=0;char ch;bool flag = false; while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true; while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x; } inline int cat_max(const int &a,const int &b){return a>b ? a:b;} inline int cat_min(const int &a,const int &b){return a<b ? a:b;} const int maxn = 400010; const double pi = acos(-1); struct complex{ double x,y; complex(){} complex(double a,double b){x=a;y=b;} complex operator + (const complex &r){return complex(x+r.x,y+r.y);} complex operator - (const complex &r){return complex(x-r.x,y-r.y);} complex operator * (const complex &r){return complex(x*r.x-y*r.y,x*r.y+y*r.x);} complex operator / (const double &r){return complex(x/r,y/r);} }; void FFT(complex *x,int n,int p){ for(int i=0,t=0;i<n;++i){ if(i > t) swap(x[i],x[t]); for(int j=n>>1;(t^=j) < j;j >>= 1); } for(int m=2;m<=n;m<<=1){ complex wn(cos(p*2*pi/m),sin(p*2*pi/m)); for(int i=0;i<n;i+=m){ complex w(1,0),u; int k = m>>1; for(int j=0;j<k;++j,w=w*wn){ u = x[i+j+k]*w; x[i+j+k] = x[i+j] - u; x[i+j] = x[i+j] + u; } } } if(p == -1) for(int i=0;i<n;++i) x[i] = x[i]/n; } double q[maxn]; complex a[maxn],b[maxn],c1[maxn],c2[maxn]; int main(){ int n;read(n); for(int i=0;i<n;++i) scanf("%lf",&q[i]); int len ; for(int i=1;(i>>2) < n;i<<=1) len = i; // printf("%dn", len); for(int i=0;i<n;++i){ a[i] = complex(q[i],0); if(i != 0) b[i] = complex(1.0/i/i,0); } FFT(a,len,1);FFT(b,len,1); for(int i=0;i<len;++i) c1[i] = a[i]*b[i]; memset(a,0,sizeof a); for(int i=0;i<n;++i) a[i] = complex(q[n-i-1],0); FFT(a,len,1); for(int i=0;i<len;++i) c2[i] = a[i]*b[i]; //for(int i=0;i<n;++i) printf("%lf %lf || %lf %lfn",c1[i].x,c1[i].y,c2[i].x,c2[i].y); FFT(c1,len,-1);FFT(c2,len,-1); for(int i=0;i<n;++i) printf("%.3lfn",c1[i].x - c2[n-i-1].x); getchar();getchar(); return 0; } ```

codeforces1036e题怎么运行错了啊
问题描述:我是linux系统,自己电脑上能跑正确答案,在线测试也是正确,但是提交后第一个样列就错.这是我的代码

#include<stdio.h>
int main()
{
int i,j,n,p,q,tep,s,r;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&p,&q);
if(p<q)
{
tep=q;
q=p;
p=tep;
}

#include <iostream>
#include <stdlib.h>                             //头文件函数
using namespace std;

#include
#define endl 'n'
#define pb push_back
#define mk make_pair
#define _ ios::sync_with_stdio
bool SUBMIT = 1;
typedef long long ll;
using namespace std;
const double PI = acos;
const double EPS = 1e-10;
double add(double a,double b){
if return a+b;
}
struct node
{
double x,y;
node(){};
node(double x,double y):x{}
bool operator return x!=b.x?x }
node operator +{
return node(add,add;
}
node operator -{
return node(add,add;
}
node operator *{
return node;
}
double dot{//neiji
return add(x*b.x,y*b.y);
}
double det{//waiji
add(x*b.y,-y*b.x);
}
}s1[1100],s2[1100];
int n,check[105];
maph;
bool on_seg(node p1,node p2,node q){//panduanshifouzaixianduanshang
return .det==0&&.dot<=0;
}
node interel(node p1,node p2,node q1,node q2){//zhaochujiaodian
return p1+*.det/.det;
}
bool on_check{
int l=3,r=105;
while{
int mid=/2;
if(k>=check[mid])l=mid;
else r=mid;
}
if(k==check[l])return true;
return false;
}
int main()
{
iffreopen("i.txt","r",stdin);else ;
for(int i=3;i cin>>n;
for(int i=0;i>s1[i].x>>s1[i].y>>s2[i].x>>s2[i].y;
int ans=0;
for(int i=0;i<n;i++)
{
node k=s1[i]-s2[i];int c;
if(!k.x||!k.y)c=maxk.x),abs);
else c=
_gcdk.x),abs);
ans+=c+1;
}
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
node a=s1[i]-s2[i],b=s1[j]-s2[j];
if==0){
continue;
}
node m=interel(s1[i],s2[i],s1[j],s2[j]);
m.x=round;m.y=round;
if(on_seg(s1[i],s2[i],m)&&on_seg(s1[j],s2[j],m)){
h[m]澳门新葡亰平台9411,++;
if(!on_checkans--;
}
}
cout<<ans<<endl;
return 0;
}

s=p*q;
while(q)//经过上面,q较小,最大公约数不会超过较小者
{
r=p%q;
p=q;
q=r;
}
printf("%dt%d",q,s/q);
return 0;
}
}
printf("%dt%d",q,s/q);
return 0;
}
}

class CRational                                 //定义一个有理数的类
{
private:
  int m;                                        //分子
  int n;                                         //分母
public:
  CRational();                                //无参数的构造函数。构造函数,用户不需调用它,而是建立对象时自动执行
  CRational(int a,int b);                       //带分子分母参数的构造函数
  CRational operator=(const CRational& obj);   //重载赋值运算符
  CRational operator+(const CRational& obj);   // 重载+号运算符
  CRational operator-(const CRational& obj);
  CRational operator*(const CRational& obj);
  CRational operator/(const CRational& obj);
  CRational operator==(const CRational& obj);
  CRational operator!=(const CRational& obj);
  CRational operator>=(const CRational& obj);
  CRational operator<=(const CRational& obj);
  void Display(void)                             //显示此有理数
  {
    cout<<m<<"/"<<n<<endl;
  }    
};

第一组样列:
9
0 0 4 4
-1 5 4 0
4 0 4 4
5 2 11 2
6 1 6 7
5 6 11 6
10 1 10 7
7 0 9 8
10 -1 11 -1
正确答案:42
我提交后答案:49
我电脑答案:42

#include<stdio.h>
#include <stdlib.h>
int gcd(int ,int);
int main()
{
int n,p,q,s,r,ss;
scanf("%d",&n);
while(n--)
{
scanf("%d %d",&p,&q);
s=p*q;
ss=gcd(p,q);

本文由澳门新葡亰平台9411发布于交流平台,转载请注明出处:求所有的$E,第一组样列

关键词:

最火资讯