当前位置: 首页 > news >正文

格路计数的一类(降维?)技巧

模拟赛考到了,记录一下。

题面:

给你二维平面上 \(n\) 个点,定义移动:$(x,y) \to (x+1,y) / (x-1,y) / (x,y+1) / (x,y-1) $(一个点可以移动到上下左右与这个点相邻的点)。移动每个点 \(m\) 次,使得最后这些点的终点是同一个点,求移动的合法方案数。\(\bmod\ {10^9+7}\),限制坐标绝对值 \(\le 10^5\)\(n\le 50,m \le 10^5\)


Sol:

暴力做法:

枚举二维平面上每个点作为终点,再枚举 \(\Delta x\),然后 \(O(m)\) 枚举贡献。时间复杂度 \(O(m^3)\),空间复杂度 \(O(m^2)\)。祭天了。。。。但是你拼上 \(ans=0\) 的答案你会得到整整 \(80\) 分的高分???甚至 \(ans=0\) 一共是 \(50\) 分????????????

std:

考虑将点旋转 \(45\) 度。设新点坐标 \((x',y')\)

然后发现我们的移动变成了:

\((x',y') \to (x'+1,y'+1) / (x'+1,y'-1)/(x'-1,y'+1) /(x'-1,y'-1)\)

然后发现 \(x,y\) 独立了,可以分开两维,对每一维分别暴力枚举值域计算贡献,最后将两部分贡献乘起来即可。

#include<bits/stdc++.h>
#include<bits/extc++.h>
using __gnu_pbds::cc_hash_table;
#define int long longusing namespace std;const int Size=(1<<20)+1;
char buf[Size],*p1=buf,*p2=buf;
char buffer[Size];
int op1=-1;
const int op2=Size-1;
#define getchar()                                                              \
(tt == ss && (tt=(ss=In)+fread(In, 1, 1 << 20, stdin), ss == tt)     \? EOF                                                                 \: *ss++)
char In[1<<20],*ss=In,*tt=In;
inline int read()
{int x=0,c=getchar(),f=0;for(;c>'9'||c<'0';f=c=='-',c=getchar());for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+(c^48);return f?-x:x;
}
inline void write(int x)
{if(x<0) x=-x,putchar('-');if(x>9)  write(x/10);putchar(x%10+'0');
}#ifndef ONLINE_JUDGE
#define ONLINE_JUDGE
#endif
#define ull unsigned long longconst ull mod=1e9+7;
const int N=4e5+5;
ull frac[N],g[N];
ull ksm(ull x,int p)
{ull ans=1;while(p){if(p&1) (ans*=x)%=mod;(x*=x)%=mod;p>>=1;}return ans;
}int n,m;
int x[N],y[N];
ull ks[N];ull C(int n,int m)
{if(m<0||n<0||n-m<0) return 0;return frac[n]*g[m]%mod*g[n-m]%mod;
}
int calc(int dx)
{if(dx>m) return 0;if((m-dx)&1) return 0;int last=(m-dx)/2;return C(m,last);
}int dodp(int *a)
{int minn=0x3f3f3f3f,maxn=-0x3f3f3f3f;int ans=0;for(int i=1;i<=n;i++) minn=min(minn,a[i]),maxn=max(maxn,a[i]);for(int i=minn-1e5;i<=maxn+1e5;i++){int nw=1;for(int j=1;j<=n;j++) (nw*=calc(abs(i-a[j])))%=mod;(ans+=nw)%=mod;}return ans;
}signed main()
{freopen("wolf.in","r",stdin);	freopen("wolf.out","w",stdout);ks[0]=1;frac[0]=g[0]=1;for(int i=1;i<N;i++) ks[i]=ks[i-1]*2%mod,frac[i]=frac[i-1]*i%mod,g[i]=ksm(frac[i],mod-2);n=read();m=read();for(int i=1;i<=n;i++) x[i]=read(),y[i]=read(); if(n==1) { cout<<ksm(4,m); return 0; }for(int i=1;i<=n;i++){int a=x[i],b=y[i];x[i]=a-b;y[i]=a+b;}cout<<dodp(x)*dodp(y)%mod;return 0;
}
http://www.jsqmd.com/news/47632/

相关文章:

  • 百度PaddleOCR-VL:基于0.9B超紧凑视觉语言模型,支持109种语言,性能超越GPT-4o等大模型 - 详解
  • hadoop处理mysql数据的性能瓶颈
  • hadoop在linux的安装
  • hadoop与mysql的综合应用解决方案
  • hadoop与mysql的数据同步方法
  • 详细介绍:2. 容器常用操作
  • 2025年上海黑臭水体修复服务权威推荐榜单:黑臭水体治理方案/河道水净化公司/河道治理服务商精选
  • 2025年KBK刚性组合式起重机供应商权威推荐榜单:KBK起重机/KBK柔性组合式起重机/KBK刚性吊源头厂家精选
  • 珠海爱尔眼科医院联系方式:常见眼病防治建议
  • 一条SQL的完整执行过程:小明查询员工信息的完整冒险故事
  • LangGraph 官方教程:聊天机器人之三 - 实践
  • 2025年不锈钢管锯片供货厂家权威推荐榜单:切H型钢/角钢切割/切碳素钢锯片源头厂家精选
  • 2025年一体式泵站生产厂家权威推荐榜单:污水一体化泵站/预制泵站/雨水泵站源头厂家精选
  • gzip linux
  • gz文件 linux
  • hadoop for linux 安装
  • 2025年塑胶跑道面层环境测试舱直销厂家权威推荐榜单:塑胶跑道环境舱/2舱塑胶跑道环境舱/4舱塑胶跑道环境舱源头厂家精选
  • selenium: 找到页面上的指定元素并点击
  • 2025年便宜的化工品国际快递企业权威推荐榜单:药品国际快递/粉末国际快递/专线国际快递服务商精选
  • 杂题选做-6
  • 2025.11.22 考试总结
  • 2025年sp防滑路面实力厂家权威推荐榜单:彩色防滑路面/陶瓷颗粒防滑路面/MMA彩色防滑路面源头厂家精选
  • 新赛季临时脱产日记
  • 数据采集第3次作业
  • php openssl, RSA私钥有PKCS#1和PKCS#8,均包含有公钥
  • 2025 年 11 月中空吹塑机厂家推荐排行榜,吹塑机,挤出吹塑机,注射吹塑机,拉伸吹塑机,发泡吹塑机,工具箱吹塑机,瓶子吹塑机公司推荐
  • CF359D-Pair of Numbers
  • 2025.11.18 写题记录
  • F032 材料科学文献知识图谱可视化分析架构(四种知识图谱可视化布局) | vue + flask + echarts + d3.js 建立
  • 2025年AI IDE的深度评测与推荐:从单一功能效率转向生态壁垒 - 教程