zoukankan      html  css  js  c++  java
  • 2021牛客OI赛前集训营-方格计数【计数,dp】

    正题

    题目链接:https://ac.nowcoder.com/acm/contest/20107/B


    题目大意

    给出一个(w imes h)的网格图,然后要求在上面选出(n)个格点,使得它们在一条直线上且两两之间距离不小于(d)

    (1leq Tleq 20,1leq w,h,dleq 500,1leq nleq 50)


    解题思路

    先只考虑横竖和斜向右下的直线
    显然是枚举直线更加迅速,可以枚举一个斜率(frac{a}{b}),然后为了防止算重我们考虑起点也就是我们选择的最第一个点,对于起点在((0,0)sim (w-ka,h-kb))的矩形内的点,右下角至少还有(k)个点可以选择,我们可以枚举这个(k),然后暴力统计。这样一次复杂度是(O(min{frac{w}{a},frac{h}{b}})),类似于调和级数不是很大。

    之后考虑统计选择的方案,设(f_{i,j,k})表示选择的两个之间要至少相隔(i),有(j)个可以选,选择(k)个的方案,这个可以直接(dp)

    就可以过了,时间复杂度:(O(whn+Twhlog {wh}))


    code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define ll long long
    using namespace std;
    const ll N=510,P=1e9+7;
    ll T,n,w,h,D,ans,d[N][N];
    int f[N][N][N];
    signed main()
    {
    	scanf("%lld",&T);
    	for(ll i=1;i<=500;i++)d[i][0]=d[0][i]=i;
    	for(ll i=1;i<=500;i++)
    		for(ll j=1;j<=i;j++)d[i][j]=d[j][i]=d[j][i%j];
    	for(ll i=1;i<=500;i++){
    		f[i][0][0]=1;
    		for(ll j=1;j<=500;j++){
    			for(ll k=0;k<=500;k++)f[i][j][k]=f[i][j-1][k];
    			if(j>=i)
    				for(ll k=1;k<=500;k++)
    					(f[i][j][k]+=f[i][j-i][k-1])%=P;
    		}
    	}
    	while(T--){
    		scanf("%lld%lld%lld%lld",&n,&w,&h,&D);
    		if(n==1){printf("%lld
    ",(w+1)*(h+1)%P);continue;}
    		ans=0;
    		for(ll i=0;i<=w;i++)
    			for(ll j=0;j<=h;j++){
    				if(d[i][j]!=1)continue;
    				ll k,last=0,ub=1;
    				if(i!=0&&j!=0)ub=2;
    				ll dis=ceil(D/sqrt(i*i+j*j));
    				for(k=1;k;k++){
    					if(k*i>w||k*j>h)break;
    					ll L=w-k*i+1;ll R=h-k*j+1;
    					(ans+=L*R%P*(1ll*(f[dis][k][n-1]-f[dis][k-1][n-1]))*ub%P)%=P;
    				}
    			}
    		printf("%lld
    ",(ans+P)%P);
    	}
    	return 0;
    }
    
  • 相关阅读:
    PI SQL 语句
    MySQL数据库远程访问权限如何打开(两种方法)
    Ajax 实现无刷新分页
    php文件缓存方法总结
    PHP常用的缓存技术汇总
    PHP缓存机制详解
    用js判断页面刷新或关闭的方法
    基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
    jquery刷新页面
    一些JavaScript基本函数
  • 原文地址:https://www.cnblogs.com/QuantAsk/p/15375017.html
Copyright © 2011-2022 走看看