您的位置:首页 > 其它

【数论】FOJ 2238 Daxia & Wzc's problem

2016-08-18 14:25 381 查看
题目链接:

  http://acm.fzu.edu.cn/problem.php?pid=2238

题目大意:

  已知等差数列A(0)的首项a和公差d,求出数列A(0)前n项和,得到新数列A(1);以此类推,最终求A(m)的第i项mod1000000007

题目思路:

  【动态规划】

  不难推出c[i][j]=c[i-1][j]+c[i][j-1]

  但是i太大不能直接递推,m<=1000不能矩阵快速幂。

  通过推导可以求出c[i][j]=a*Cn-1n+m-1+d*Cn-2n+m-1

  求模时除改为乘逆元(amod-2)

//
//by coolxxx
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define mem(a,b) memset(a,b,sizeof(a))
#define eps (1e-8)
#define J 10
#define mod 1000000007
#define MAX 0x7f7f7f7f
#define PI 3.14159265358979323
#define N 100004
using namespace std;
typedef long long LL;
int cas,cass;
int n,m,lll,ans;
struct xxx
{
LL a,b;
}c
;
bool cmp(xxx aa,xxx bb)
{
if(aa.a!=bb.a)return aa.a<bb.a;
return aa.b<bb.b;
}
void work(int x)
{
int l=1,r=n,mid;
LL y1,y2;
c[0].a=0;c[0].b=-1000000001*1000000001;
while(l<r)
{
mid=(l+r)>>1;
y1=c[mid-1].a*x+c[mid-1].b;
y2=c[mid].a*x+c[mid].b;
if(y1<=y2)l=mid+1;
else r=mid;
}
y1=c[r-1].a*x+c[r-1].b;
y2=c[r].a*x+c[r].b;
printf("%I64d\n",max(y1,y2));
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,x;
// for(scanf("%d",&cas);cas;cas--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
while(~scanf("%d",&n))
// while(~scanf("%d",&n))
{
scanf("%d",&m);
for(i=1;i<=n;i++)
scanf("%I64d%I64d",&c[i].a,&c[i].b);
sort(c+1,c+1+n,cmp);
for(i=1;i<n;i++)
if(c[i].a==c[i+1].a)c[i].a=1000000001;
sort(c+1,c+1+n,cmp);
while(c
.a==1000000001)n--;
for(i=1;i<=m;i++)
{
scanf("%d",&x);
work(x);
}
}
return 0;
}
/*
//

//
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: