首页 > 其他分享 >2020CCPC长春(待补)

2020CCPC长春(待补)

时间:2022-11-22 19:11:06浏览次数:49  
标签:pre 待补 ll 2020CCPC int base 长春 include mod

D. Meaningless Sequence

分析:

我居然找规律做出来了!!!!

发现 长度为k的一系列数 就是长度为k-1的一系列复制一遍 加上 k-1的一系列乘c 再复制一遍

这样前缀和就能处理出来 pre[k] 表示 长度为k的前缀和

然后 依次处理串的当前位置的长度lennow 如果是1 那就加上 pre[lennow-1]乘C[num]

其中C[num] 表示在当前位置前有多少个1 pre[lennow-1]会被递推式算C[num]次

特判最后一位即可

按照我的做法复杂度只是O(len) 数据再开大点都行

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int mod=1e9+7;
const int maxn=3005;
int len;
ll pre[maxn],c,res,Ans,C[maxn];
string n;
void solve();
void dfs(int,int);
int main(){
	int T;T=1; 
	while(T--)solve();
     return 0;
}
void solve(){
    cin>>n>>c;
	pre[1]=1+c;
	pre[2]=(1+c+c*(1+c)%mod)%mod;
	res=c*(1+c)%mod;
	C[0]=1;
	C[1]=c;C[2]=c*c%mod;
	len=n.size();
	for(int i=3;i<=len;i++)
	res=res*(1+c)%mod,pre[i]=(res+pre[i-1])%mod,C[i]=C[i-1]*c%mod;
	dfs(0,0);
	cout<<Ans;
}
void dfs(int now,int num){
	if(now==len-1){
		if(n[now]=='0')
		Ans=(Ans+C[num])%mod;
		else Ans=(Ans+C[num]*(1+c)%mod)%mod;
		return;
	}
	if(n[now]=='1')
	Ans=(Ans+pre[len-now-1]*C[num])%mod,dfs(now+1,num+1);
	else dfs(now+1,num);
}

数位dp解法:
可以发现一个数的大小与它的二进制表示中的1的个数有关,a=c^(二进制中1的个数)

那么题目就转化为求所有数中1的个数

使用的是数位dp的方法,枚举1的个数来分配。

对于没有上限要求的x长度串中分配y个1的方案数直接可以使用组合数C(y,x)

#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
using namespace std;
#define ll long long 
const int mod = 1e9 + 7;
ll ans;
int m;
string a;
int sz;
ll c[3100][3100]; //组合数
int num[3100];
ll fastpow(ll base, ll n, ll mod) {
	ll ans = 1;
	while (n) {
		if (n & 1) ans *= base % mod, ans %= mod;
		base *= base, base %= mod;
		n >>= 1;
		
	}
	return ans % mod;
}

void init() {
	cin >> a;
	cin >> m;
	sz = a.size();
	for (int i = 0; i <= sz; i++) {
		c[i][i] = c[i][0] = 1;
		for (int j = 1; j < i; j++) {
			c[i][j] = (c[i - 1][j] + c[i - 1][j - 1])%mod;
		}
	}
}
ll helper(int pos, int limit, int cnt, int k) {
	if (pos == -1)
		return cnt==k;
	if (!limit) {
		if (cnt <= k)
			return c[pos + 1][k - cnt];
		else
			return 0;
	}
	ll res = 0;
	int up = limit ? num[pos] : 1;
	for (int i = 0; i <= up; i++) {
		res += helper(pos - 1, limit && i == up, cnt+i, k) % mod;
		res %= mod;
	}
	return res;
}
void solve() {
	for (int i = 0; i < sz; i++) 
		num[i] = a[sz - i - 1] - '0';
	ll base = 1;
	for (int i = 0; i <= sz; i++) {  //枚举1的个数
		ans += base * helper(sz - 1, 1, 0, i) % mod;
		ans %= mod;
		base *= m;    
		base %= mod;
	}
	cout << ans << endl;
}
int main() {  
	init();
	solve();
	return 0;
}

标签:pre,待补,ll,2020CCPC,int,base,长春,include,mod
From: https://www.cnblogs.com/wzxbeliever/p/16916159.html

相关文章

  • 秦皇岛2020CCPC补题
    秦皇岛2020CCPCA,E,F,G,I,KA.AGreetingfromQinhuangdao知识点:简单题复杂度:\(O(logn)\)#include<bits/stdc++.h>usingnamespacestd;#definerep(i,l,r)for(in......
  • 绵阳2020CCPC补题
    绵阳2020CCPCD,K,J,L,GD.DefusetheBombs知识点:二分答案复杂度:\(O(nlogn+log^2n)\)vp时我猜了一个结论,验了几个样例就写了,喜提WA3然后队友写了二分答案复杂度\(O(......
  • 长春花题解
    题意概述给定一个素数\(p\),对每个\(0\lex<p\),设\(f(x)\)表示一个最小的非负整数\(a\),使得存在一个非负整数\(b\),满足\((a^2+b^2)\bmodp=x\)。现在,你想要......
  • 分页提取和游标 ,待补充,游标的类型
     1.分页提取数据,偏移2个,每页3个。--select*FROM Person--whereAge>18--ORDERBYid --必须有orderby,否则报错--offset2rowsfetchnext3rowsonly2......
  • vue组件间的通讯(10种方法)【重要】(待补充。。。)
    1.props/$emitprops主要用于父组件传递数据给子组件,父==>子。Vue自定义事件父组件可以在使用子组件的地方直接用v-on来监听子组件触发的事件。即父组件中使用v-on绑定自......
  • 深度学习——卷积神经网络压缩方法总结(等待补充)
    卷积网络压缩方法总结卷积网络的压缩方法​​一,低秩近似​​​​二,剪枝与稀疏约束​​​​三,参数量化​​​​四,二值化网络​​​​五,知识蒸馏​​​​六,浅层网络​​我们知......
  • ATM+shopping_car ——面条版(待补充)——三层架构思路
    ATM+shopping_car——面条版(待补充)——三层架构思路#coding:utf-8importosimportsysimportjsonroot_dir=os.path.dirname(os.path.dirname(__file__))user......
  • 数学专题(挖坑待补)
    0x10质数质数基本定理质数的定义:只被\(1\)和它本身整除的正整数叫做质数。非质数的正整数叫做合数。特别的,\(1\)既不是质数也不是合数。质数的数量很少。只......
  • Tower Defense (分块+差分的差分+优化空间方法, 主席树做法待补)
    题目大意:   思路:这题难点在于每一秒会恢复值而且(mi+ri,ci)有一个阈值. 发现一个点被清理后,他的恢复有3个状态,一次恢复ri的值,当t<ci/ri,恢复ci%ri......
  • 2020CCPC威海 C Rencontre(树形DP,期望)
    题意:有3个人,每个人有一些待选位置。就是当确定三个人确定位置u1,u2,u3后,需要找到一个位置v到三个位置的距离之和最小,现在给出u1,u2,u3的待选取值,问距离......