首页 > 其他分享 >P9640 [SNCPC2019] Digit Mode

P9640 [SNCPC2019] Digit Mode

时间:2024-08-23 15:05:16浏览次数:12  
标签:Digit ll P9640 len fac define SNCPC2019 sum mod

思路:

定义 \(F(l,r)\) 表示若已经确定了 \([1,l-1]\) 的数,且 \([l,r]\) 没有限制的贡献数。

设 \(n\) 的长度为 \(len\),考虑先求出 \([1,i](i \le len-1)\) 的贡献(是没有限制的),那么每次枚举第 \(1\) 位数字 \(a_1 \in [1,9]\),算上 \(F(2,i)\) 的贡献即可。

则该情况贡献和为:

\[\sum_{i=1}^{len-1} \sum_{j=1}^9 F(2,i) \]

现在来考虑长度为 \(len\) 的数的贡献的和,也考虑枚举第 \(i\) 位的数字 \(j\),那么若想要使得 \([i+1,len]\) 没有限制,则至少要满足 \(i \in [0,n_i-1]\),为了使得后面不算重,故我们要每次算完 \([i+1,len]\) 的贡献和后,需要令 \(a_i = n_i\)。

则该情况贡献和为:

\[\sum_{i=1}^{len} \sum_{j=[i=1]}^{n_i-1} F(i+1,len) \]

注意最后要单独计算 \(n\) 本身的贡献。

现在我们来考虑确定 \(a_{1,\cdots,l-1}\) 的情况下如何计算 \(F(l,r)\)。

考虑枚举众数最大值 \(i\) 和众数的出现次数 \(j\),设 \(p_i\) 表示 \(i\) 的出现次数,那么在后面 \([l,r]\) 内 \(i\) 至少还需要出现 \(j-p_i\) 次;同时为了确保 \(i\) 是众数,需要满足 \([0,i-1]\) 的出现次数 \(\le j\),且 \([i+1,9]\) 的出现次数 \(\le j-1\);即现在我们要求将 \(r-l+1-(j-p_i)\) 个位置分配给除了 \(i\) 以外的 \(9\) 个数的且满足限制的方案数。

设我们枚举的众数为 \(k\),众数出现次数为 \(mx\),使用动态规划算法,定义 \(f_i\) 表示可以分配 \(i\) 个位置的方案数,考虑枚举选的数 \(j\) 和分配给 \(j\) 的数量 \(k\),背包形转移:

\[f_i = \sum_{j=0}^9 [j \ne k] \sum_{k=0}^{\min(mx,p_j-[i>k])} \binom{i}{k} f_{i-k} \]

可以先预处理阶乘和逆元来计算组合数。

注意要先枚举 \(j\)。

完整代码:

#include<bits/stdc++.h>
#define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y)
#define lowbit(x) x&(-x)
#define pi pair<ll,ll>
#define pii pair<ll,pair<ll,ll>>
#define iip pair<pair<ll,ll>,ll>
#define ppii pair<pair<ll,ll>,pair<ll,ll>>
#define fi first
#define se second
#define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x
#define Full(a) memset(a,0,sizeof(a))
#define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout);
#define For(i,l,r) for(int i=l;i<=r;i++)
#define _For(i,l,r) for(int i=r;i>=l;i--)
using namespace std;
typedef long double lb;
typedef double db;
typedef unsigned long long ull;
typedef long long ll;
bool Begin;
const ll N=55,mod=1e9+7;
inline ll read(){
    ll x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')
          f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}
inline void write(ll x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)
	  write(x/10);
	putchar(x%10+'0');
}
ll T,n,t,g,ans,sum;
ll a[N],h[N],p[N],f[N],fac[N],inv[N];
char s[N];
ll qpow(ll a,ll b){
    ll ans=1;
    while(b){
        if(b&1ll)
          ans=(ans*a)%mod;
        a=(a*a)%mod;
        b>>=1ll;
    }
    return ans;
}
void init(){
    fac[0]=fac[1]=1;
    For(i,2,N-1)
      fac[i]=(fac[i-1]*i)%mod;
    inv[N-1]=qpow(fac[N-1],mod-2);
    _For(i,0,N-2)
      inv[i]=inv[i+1]*(i+1)%mod;
}
ll C(ll n,ll m){
    if(m>n||m<0)
      return 0;
    if(!m||n==m)
      return 1;
    return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
ll get(ll n,ll k,ll mx){
	memset(f,0,sizeof(f));
    f[0]=1;
	For(i,0,9){
		if(i==k)
		  continue;
        t=mx-(i>k)-p[i];
		if(t<0)
		  return 0;
        _For(j,1,n)
          For(k,1,min((int)t,j))
			f[j]=(f[j]+f[j-k]*C(j,k)%mod)%mod;
	}
	return f[n];
}
ll get(ll l,ll r){
    sum=0;
    For(i,0,9)
      p[i]=0;
    For(i,1,l-1)
      p[a[i]]++;
    For(i,1,9)
      For(j,p[i],p[i]+r-l+1)
        sum=(sum+get(r-l+1-j+p[i],i,j)*C(r-l+1,r-l+1-j+p[i])%mod*i%mod)%mod;
    return sum;
}
void solve(){
    ans=0;
    scanf("%s",s+1);
    n=strlen(s+1);
    For(i,1,n)
      h[i]=s[i]-'0';
    For(i,1,n-1){
        For(j,1,9){
            a[1]=j;
            ans=(ans+get(2,i))%mod;
        }
    }
    For(i,1,n){
        For(j,(i==1),h[i]-1){
            a[i]=j;
            ans=(ans+get(i+1,n));
        }
        a[i]=h[i];
    }
    write((ans+get(n+1,n))%mod);
    putchar('\n');
}
bool End;
int main(){
    init();
    T=read();
    while(T--)
      solve();
	//cerr<<'\n'<<abs(&Begin-&End)/1048576<<"MB";
	return 0;
}

标签:Digit,ll,P9640,len,fac,define,SNCPC2019,sum,mod
From: https://www.cnblogs.com/rgw2010/p/18375518

相关文章

  • A 3nm, 32.5TOPS/W, 55.0TOPS/mm2 and 3.78Mb/mm2 Fully-Digital Compute-in-Memory M
    1、强调存储密度(StorageDensity)Mb/mm2,存算一体的主要目的是减少数据搬运的开销,如果一味的堆计算单元而损失存储密度,那么虽然整体的计算吞吐率(TOPS)可以做到很大,相应的对计算密度也会有提升,但是由于需要频繁给CIMMacro刷新数据,从系统能效的角度上来说反而是下降的。这次的SRAMArr......
  • A 12nm 121-TOPS/W 41.6-TOPS/mm2 All Digital Full Precision SRAM-based Compute-in
    1b*4b的操作是通过4b或非门乘法器完成,然后再通过4b加法器两两相加。但是从真值表上来看,2个4b或非门乘法器加1个4b加法器完成的工作实际上可以通过一个由加法器和两比特IN控制的四选一Mux(或者说LUT)来完成。这样做的话可以直接节省掉21%的功耗。提出的这个并行多位输入结构下(即并......
  • A 4nm 6163-TOPS/W/b 4790-TOPS/mm2/b SRAM Based Digital-Computing-in-Memory Macro
    SRAMarray和Localadder耦合在一起形成一个块,两个块share一个semi-global-adder,四个块再去shareGlobaladder和移位累加器。这样的floorplan使得整体结构上不存在一大块独立的巨型多级加法树,使得布局变得更加的规整。这里讨论了mix-Vt设计的问题,即混用高Vt管子和低Vt管子,高Vt......
  • An 89TOPS/W and 16.3TOPS/mm2 All-Digital SRAM-Based Full-Precision Compute-In Me
    权重是4bit的CIM结构图:激活值是4bit的做法是:以MSB-first的方式串性送入,然后通过移位加计算不同数位的和累加器就是一个移位累加结构,其中具有对符号位的处理机制,这里是补码机制。如果符号位是0,直接原码做符号位拓展加进去,如果符号位是1,取反加1原码转成补码之后加进去。减少......
  • Vue 报错error:0308010C:digital envelope routines::unsupported
    目录Vue报错error:0308010C:digitalenveloperoutines::unsupported方法1.打开终端(按健win+R弹出窗口,键盘输入cmd,然后敲回车)并按照说明粘贴这些:方法2.安装vnm及node版本方法3.在项目package.json文件中增加配置Vue报错error:0308010C:digitalenveloperoutine......
  • region format is illegal, only digit, letter and - is allowed!(.env文件中行内注释
    引子:一个图片上传功能,用腾讯云cos,一直找不到错误原因,结果是.env文件中的行内注释!错误描述上传图片代码defaction_upload_img_cloud(request):user=CustomUser.objects.get(id=request.user_id)file=request.FILES['img']file_name=file.nameun......
  • AT_abl_e Replace Digits 题解
    题目传送门前置知识线段树解法需要维护区间信息,考虑使用线段树维护。预处理出\(\overline{xx\dotsx}\),其中\(x\in\{1,2,3,4,5,6,7,8,9\}\),便于区间赋值。然后就是普通的线段树板子了。代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#de......
  • Digitwise_addition:超出限制:如果超出 -> 代码超时
    我正在研究kata。按位加法是一种特殊的加法,它不是通常向数字加1,而是向该数字的每个数字加1。如果数字是9,我们将其替换为10,而不保留到下一个数字。示例123->234任务编写一个接受两个数字n和k的函数,并在应用数字加法k次后输出n中的位数。由于答......
  • CF1866D Digital Wallet
    传送门题意给你一个\(n*m\)正数矩阵,(\(n\le10,m\le1e5,k\le10\)),有一个\(n*k\)的窗口在矩阵中,\(k\leqm\),这个窗口一开始在最左边,你可以从窗口覆盖的范围里取出一个数加入答案并置零,接下来窗口会每次向右滑动一格,每次滑动完你都可以取一个数加入答案并置零,直到窗口......
  • 使用 DigitalOcean Spaces 在 Django 应用程序中初始化 boto3 会话时出错
    当我尝试将Django应用程序配置为使用DigitalOceanSpaces处理静态文件和媒体文件时,我遇到了问题。这是我的settings.py文件的相关部分:importboto3frombotocore.exceptionsimportNoCredentialsError,PartialCredentialsErrorfrombotocore.clientimportCo......