Codeforces Round #630 (Div. 2)(D构造 ,E 二项式定理计数)

题目链接

D. Walk on Matrix

题意:给你一个k,要你构造一个n*m的权值矩阵,Bob按照这样的dp求:

而这个矩阵的真正的路线最大值减去Bob得到的dp[n][m]等于k。

思路:显然让Bob的dp[n][m]为0  比较好构造,我只需要构造k出来就行了。花费了一页草稿纸后终于发现了解法:

设len为k二进制下长度,刚好比k大一位的长度。

m=1<<len

k+m m    m k

k m+k k k

Bob的路线:(1,1)(1,2)(2,2)(2,3)(2,4)对应的权值为:k+m -> m ->m ->0->0

正确的路线(1,1)(2,1)(2,2)(2,3)(2,4) 对应的权值为k+m-> k ->k ->k->k

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=5e2+10;
int dp[N][N],a[N][N],n,m,k;
int main()
{

    n=2,m=4;
	cin>>k;
	int x=k,len=0;
	while(x)++len,x=x/2;

	a[1][4]=a[2][1]=a[2][3]=a[2][4]=k;
	//len++;

	a[1][2]=a[1][3]=1<<len;

	int t=0;


	a[1][1]=a[2][2]=a[1][2]+k;

	printf("%d %d\n",n,m);
	rep(i,1,n)
	{
	    rep(j,1,m) printf("%d ",a[i][j]);
	    puts("");
	}
}
/*
84306
*/

E. Height All the Same

题意:给你n,m,l,r  问你有多少个原始矩阵,l<=a[i][j]<=r   通过以下两个操作使得高度一样高:

1:选择一个升高2高度,

2:选择两个同时升高一个高度

思路:不会,搜的题解:来自:

其实就是当n*m为偶数时    且 矩阵内 奇数个数 为奇个  且偶数个数也为奇个 就是不合法的矩阵。

那么就用(r-l+1)^(n*m) - 不合法的

不合法=\sum _{i=1,i=i+2}^{n*m}O^{i}*E^{n*m-i}

(r-l+1)^(n*m) - \sum _{i=1,i=i+2}^{n*m}O^{i}*E^{n*m-i}=

#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;
ll n,m,l,r,ans;
ll ppow(ll a,ll x)
{
    ll tans=1;
    while(x)
    {
      if(x&1)tans=tans*a%mod;
      a=a*a%mod;x>>=1;
    }
    return tans;
}
int main()
{
    scanf("%lld%lld%lld%lld",&n,&m,&l,&r);
    if((n*m)&1)ans=ppow(r-l+1,n*m);
    else ans=(ppow(r-l+1,n*m)+ppow((r-l+2)/2-(r-l+1)/2,n*m))*ppow(2,mod-2)%mod;
    printf("%lld\n",ans);
    return 0;
}
发布了519 篇原创文章 · 获赞 69 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/105255254