首页 > 其他分享 >AtCoder Regular Contest 058 [ARC058] E - Iroha and Haiku

AtCoder Regular Contest 058 [ARC058] E - Iroha and Haiku

时间:2025-01-15 22:54:54浏览次数:1  
标签:AtCoder ARC058 le Contest Iroha 058 序列 统计

题意:

对于所有长度为\(n\),每个数在1到10之间的序列,问有多少个中包含一字串,满足字串可以分为三段和恰好为\(x,y,z\)的部分

数据满足:

\[3 \le n \le 40 , 1 \le x \le 5 , 1 \le y \le 7, 1 \le z \le 5, \]

思路

正向统计有多少个序列满足会遇到重复统计的问题,难以克服,考虑统计统计非法序列总数
注意到 \(x+y+z \le 17\)
则考虑用状压表示一个序列尾部所能表示的所有数字
下以二进制举例:
对于序列
2 3 1 2
其状态为 \(10100110\)
即从尾部来看,其和可以表示为
2 3 6 8
记当前序列状态为\(k\)
则合法状态为 $k \& ((1 << (z-1)) | (1 << (z+y-1)) | (1 << (z+y+x-1))) = ((1 << (z-1)) | (1 << (z+y-1)) | (1 << (z+y+x-1))) \( 假设添加了一个新的数\)j\( \)k\(变成\)(k<<j)|(1<<(j-1))$
转移统计即可

点击查看代码 ```cpp void solve(){ ll x , y , z , n; cin >> n >> x >> y >> z; ll lg = (1ll << (z-1)) + (1ll << (y+z-1)) + (1ll << (x+y+z-1)) , maxn = (1ll << (x+y+z)); dp[0][0] = 1; for (int i = 1 ; i <= n ; ++i){ for (ll j = 1 ; j <= 10 ; ++j){ for (ll k = 0 ; k <= maxn ; ++k){ ll tmp = (k << j)|(1ll << (j-1)); tmp %= maxn; if ((tmp&lg) == lg) continue; dp[tmp][i] += dp[k][i-1]; dp[tmp][i] %= mod; } } } ll ans = quick_pow(10 , n)%mod; for (ll k = 0 ; k <= maxn ; ++k){ ans = ((ans-dp[k][n])%mod+mod)%mod; } cout << ans << "\n"; } ```

标签:AtCoder,ARC058,le,Contest,Iroha,058,序列,统计
From: https://www.cnblogs.com/happyalg/p/18673868

相关文章

  • VP Daiwa Securities Co. Ltd. Programming Contest 2024(AtCoder Beginner Contest 38
    A-Humidifier1题意:一个漏水的桶,在零时刻有零升水,进行\(n\)次加水,在\(t_i\)时刻加\(v_i\)升水,每一时刻会漏一生水,问第n次加水后有多少升水。直接模拟即可,每次加水先减去漏掉的水,注意至少有0升,然后加上新加的水。点击查看代码voidsolve(){intn;std::cin>>n;......
  • VP Toyota Programming Contest 2024#12(AtCoder Beginner Contest 384)
    A-aaaadaa题意:给你一个字符串和两个字符\(c_1\),\(c_2\),把字符串里的所有不等于\(c_1\)的字符都换成\(c_2\)。模拟即可。点击查看代码voidsolve(){intn;chara,b;std::cin>>n>>a>>b;std::strings;std::cin>>s;for(auto&c:......
  • AtCoder Regular Contest 067
    \(AT\_arc067\_a\)https://www.luogu.com.cn/problem/AT_arc067_a题解:筛出\(1\simn\)中质数,计算每个质数出现次数,再累乘即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=1010,P=1e9+7;intn;intbuc[N];intprime[N],cnt;bool......
  • AtCoder Regular Contest 066(缺d)
    \(AT\_arc066\_a\)https://www.luogu.com.cn/problem/AT_arc066_a题解:长度为\(n\)的队列,其\(A\)数组固定,直接判断题目给定\(A\)数组是否符合题意即可。若符合题意,答案为\(2^{\frac{n}{2}}\),否则答案为\(0\)。#include<bits/stdc++.h>usingnamespacestd;typedeflonglon......
  • atcoder 388 b-e题
    binclude<bits/stdc++.h>usingnamespacestd;/**@brief主函数,程序入口@returnint返回值为0,表示程序正常结束*/intmain(){//输入数组长度n和天数dintn,d;cin>>n>>d;//定义一个vector,用于存储输入数据vector<pair<int,int>>a(n);//输入数组a的元......
  • Atcoder ABC388F Dangerous Sugoroku 题解 [ 蓝 ] [ 矩阵加速 ] [ 状压矩乘 ] [ 模拟
    DangerousSugoroku:赛时写了矩乘T飞了,受到sunkuangzheng大佬的启发才知道要状压矩乘。暴力矩乘思路直接像过河那样写模拟细节非常多,于是考虑像美食家一样的思路,利用矩阵分段加速。定义\(dp_i\)表示\(i\)能否到达,则有如下转移:\[dp_{i}=\bigvee_{j=i-B}^{i-A}dp_{j}\]......
  • Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]
    CountArrays:一眼秒的计数题。思路显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是\(1\),就会形成一个基环树森林。那么考虑这个环上能填什么数。因为所有数都小于等于他后面的数,所以所有数都只能相等。这就启发我们在基环树上缩点之后再进行计数。那么当缩完点......
  • AtCoder Beginner Contest 388 (abc388) 赛后复盘
    为什么不会E????A-B模拟即可。C每一个大麻薯可以和所有小于等于自己\(\frac12\)的麻薯结合,二分即可。时间复杂度\(O(n\logn)\)。点击查看代码#include<bits/stdc++.h>#definelllonglong#definei128__int128#definemem(a,b)memset((a),(b),sizeof(a))#def......
  • HHKB Programming Contest 2025(AtCoder Beginner Contest 388)
    A-?UPC题意:给你一个字符串,把他的第一个字符和"UPC"输出。输出即可。点击查看代码voidsolve(){std::strings;std::cin>>s;std::cout<<s[0]<<"UPC\n";}B-HeavySnake题意:n条蛇由厚度和长度,重量为厚度乘长度,问长度加上1~k时,最大的蛇的重量分别......
  • AtCoder Beginner Contest 387
    A-HappyNewYear2025题意给定正整数\(A,B\),求\((A+B)^2\)思路模拟代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>pii;constintmxn=1e6+5;voidsolve(){ inta,b; cin>>a......