BZOJ4115 : [Wf2015]Tile Cutting

设一种方案里三角形上三个点的坐标分别为$(0,0),(-a,b),(c,d)$,则得到的平行四边形的面积为$ac+bd$。

设$d(n)$为$n$的约数个数,$D$为$d$的生成函数,则答案的生成函数$=D^2$。

先用线性筛$O(n)$求出$d$,再用FFT在$O(n\log n)$的时间内预处理出所有答案即可。

#include<cstdio>
#include<cmath>
#include<algorithm>
#define N 1048576
using namespace std;
typedef long long ll;
int n=500000,d[N],g[N],i,j,p[N],tot,T,l,r,ans;bool v[N>>1];ll f[N];
struct comp{
  double r,i;comp(double _r=0,double _i=0){r=_r;i=_i;}
  comp operator+(const comp x){return comp(r+x.r,i+x.i);}
  comp operator-(const comp x){return comp(r-x.r,i-x.i);}
  comp operator*(const comp x){return comp(r*x.r-i*x.i,r*x.i+i*x.r);}
}a[N];
const double pi=acos(-1.0);
void FFT(comp a[],int n,int t){
  for(int i=1,j=0;i<n-1;i++){
    for(int s=n;j^=s>>=1,~j&s;);
    if(i<j)swap(a[i],a[j]);
  }
  for(int d=0;(1<<d)<n;d++){
    int m=1<<d,m2=m<<1;
    double o=pi/m*t;comp _w(cos(o),sin(o));
    for(int i=0;i<n;i+=m2){
      comp w(1,0);
      for(int j=0;j<m;j++){
        comp &A=a[i+j+m],&B=a[i+j],t=w*A;
        A=B-t;B=B+t;w=w*_w;
      }
    }
  }
  if(t==-1)for(int i=0;i<n;i++)a[i].r/=n;
}
int main(){
  for(d[1]=1,i=2;i<=n;i++){
    if(!v[i])p[tot++]=i,d[i]=2,g[i]=1;
    for(j=0;i*p[j]<=n&&j<tot;j++){
      v[i*p[j]]=1;
      if(i%p[j]){
        d[i*p[j]]=d[i]*2;
        g[i*p[j]]=1;
      }else{
        d[i*p[j]]=d[i]/(g[i]+1)*(g[i]+2);
        g[i*p[j]]=g[i]+1;
        break;
      }
    }
  }
  for(i=1;i<=n;i++)a[i].r=d[i];
  FFT(a,N,1);
  for(i=0;i<N;i++)a[i]=a[i]*a[i];
  FFT(a,N,-1);
  for(i=1;i<=n;i++)f[i]=(ll)(a[i].r+0.5);
  for(scanf("%d",&T);T--;printf("%d %lld\n",ans,f[ans])){
    scanf("%d%d",&l,&r);
    for(ans=l;l<=r;l++)if(f[l]>f[ans])ans=l;
  }
  return 0;
}

  

时间: 2024-10-12 03:09:34

BZOJ4115 : [Wf2015]Tile Cutting的相关文章

bzoj4109: [Wf2015]Cutting Cheese

Description 给定一个100*100*100(单位:毫米)的奶酪方块,这个奶酪含有n个球形小孔.现在要求将这个奶酪切成s片使得每片质量相等. Input 第一行包含两个整数n,s,表示奶酪有n个小空,要切成s片(0≤n≤10000,1≤s≤100) 接下来n行每行包含四个正整数r,x,y,z来描述每个小孔,r代表半径,(x,y,z)代表球心坐标.0≤r,x,y,z≤100,000(单位:微米) 我们假定切割必须垂直于z轴.对于小孔,孔与孔之间不会重叠(但可能相切),且每个孔都完全被奶酪

Vector Tile

Mapbox Vector Tile Specification A specification for encoding tiled vector data. <?XML:NAMESPACE PREFIX = "[default] http://www.w3.org/2000/svg" NS = "http://www.w3.org/2000/svg" />License The text of this specification is licens

UVA - 10003 —— Cutting Sticks

很基础的一道区间DP :) #include <cstdio> #include <iostream> #define INF 0x3f3f3f3f using namespace std; int c[1005]; int dp[1005][1005]; int main () { int l, n; while(scanf("%d", &l)!=EOF && l) { scanf("%d", &n); fo

uva 10003 Cutting Sticks 简单区间dp

// uva 10003 Cutting Sticks 区间dp // 经典的区间dp // dp(i,j)表示切割小木棍i-j所需要的最小花费 // 则状态转移为dp(i,j) = min{dp(i,k) + dp(k,j) + a[j]-a[i]) // 其中k>i && k<j // a[j] - a[i] 为第一刀切割的代价 // a[0] = 0,a[n+1] = L; // dp数组初始化的时候dp[i][i+1]的值为 0,这表示 // 每一段都已经是切割了的,不

ArcGIS 制作 “地图切片(tile)”

地图切片简介 地图切片,就是将一幅地图切成很多大小一致的小块,调用时候,只有需要的部分才会发送过去,节省带宽的同时,还节省了服务器端实时渲染地图的时间.但是地图切片有一个特点,就是不适合经常变动,或者说实时动态的数据,因为地图切片是地图服务器端事先渲染好的,而且制作地图切片是一个漫长的过程,可以说真的需要很长时间,但是用一次的耗费,换来性能的提升和节省多次渲染的时间是值得的. 切片的示意图如下图,在地图上覆盖这么一个网格,直接切出来.不同之处是,切片可能会分很多级,为了支持在不同缩放级别的显示:

WinForms界面控件初探:布局灵活、让你灵感一现的Tile Control

超乎你想象!WinForms Grid Control处理100万行数据到底有多快? WinForms界面控件初探:处理速度飞快的WinForms Data Grid(1) WinForms界面控件初探:处理速度飞快的WinForms Data Grid(2) WinForms界面控件初探:支持读写XLSx, XLS, CSV 和 TXT文件的Spreadsheet Control WinForms界面控件初探:强大的嵌入式多功能Data Editors WinForms界面控件初探:功能强大且

UVa 10003 (可用四边形不等式优化) Cutting Sticks

题意: 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用. 分析: d(i, j)表示切割第i个切点到第j个切点这段所需的最小费用.则有d(i, j) = min{d(i, k) + d(k, j)} + a[j] - a[i]; ( i < k < j ) 最后一项是第一刀的费用. 时间复杂度为O(n3) 最后还要注意一下输出格式中整数后面还要加一个句点. 1 //#define LOCAL 2 #include <iostream>

UVa10003 Cutting Sticks

考虑d(i,j)表示切割点i到j这段距离的最小花费,于是d(i,j)=min(d(i,k)+d(k,j))+a[j]-a[i] ,其中j<k<i,边界条件d(i,i)=d(i,i+1)=0,最终求d(0,n+1),复杂度o(n^3),可采用记忆化搜索. /*----UVa10003 Cutting Sticks 设d(i,j)为切割木棍(i,j)的最小费用,则d(i,j)=a[j]-a[i]+min{d(i,k)+d(k,j)} i<k<=j;最终求d(0,n+1) 为了方便,可以

Numpy的tile函数

1.函数的定义与说明 tile函数是模板numpy.lib.shape_base中的函数. 函数的形式是tile(A,reps) 函数参数说明中提到A和reps都是array_like的,什么是array_like的parameter呢?在网上查了一下,始终搞不明白,便把熟悉的python数据类型都试了一下,得出以下结论. A的类型众多,几乎所有类型都可以:array, list, tuple, dict, matrix以及基本数据类型int, string, float以及bool类型. re