首页 > 其他分享 >题解:P8245 [COCI2013-2014#3] PAROVI

题解:P8245 [COCI2013-2014#3] PAROVI

时间:2024-10-29 19:01:51浏览次数:4  
标签:cnt int 题解 sum COCI2013 ret int64 PAROVI mod

题意

定义两个整数 \(A,B\) 之间的距离为这两个整数所有对应位上的数的差的绝对值之和,记为 \(\operatorname{dist}(A,B)\)。特别地,如果 \(A,B\) 两数的位数不相同,则在位数较小的数前补足前导 \(0\)。

现在,给定两个整数 \(L,R\),请你求出所有在区间 \([L,R]\) 内的整数对的距离和。请对 \(\bf 10^9+7\) 取模

分析

考虑记录在每一个数位上每个数出现了多少次。

令 \(cnt_{i,j}\) 表示第 \(i\) 位上数码 \(j\) 出现了多少次。

这样我们就可以枚举数码 \(j\) 以统计答案,答案即为:

\[2\cdot\sum_{i=1}^{\text{len}(R)}\sum_{j=0}^9\sum_{k=j+1}^9(k-j)\times cnt_{i, j}\times cnt_{i, k} \]

我们只需要解决 \(cnt\) 的计数问题就行了。

首先将问题转化为求 \([0, L-1]\) 和 \([0, R]\) 各数码在每一位出现的次数,二者相减即是答案区间 \([L, R]\)。

上面所求的可以使用数位 dp 解决。

时间复杂度 \(O(\log R)\)。

Code

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007

int64_t ksm(int64_t x, int l)
{
    int64_t ret=1;
    for(;l;l>>=1, x=x*x%mod)
        if(l&1) ret=ret*x%mod;
    return ret;
}

int64_t cnt[50004][10];
int64_t tag[50004];

int64_t calc(const string &s, int p, int op)
{
    if(p<0) return 1;
    int64_t mx=s[p]^48;
    int64_t w=ksm(10, p);
    if(p) tag[p-1]=((tag[p-1]+op*ksm(10, p-1)*mx)%mod+mod)%mod;
    for(int i=0;i<mx;i++) cnt[p][i]=((cnt[p][i]+w*op)%mod+mod)%mod;
    int64_t ret=mx*w%mod;
    int64_t tmp=calc(s, p-1, op);
    cnt[p][mx]=((cnt[p][mx]+tmp*op)%mod+mod)%mod;
    return (ret+tmp)%mod;
}

string a, b;

void reduce(string &s)
{
    reverse(s.begin(), s.end());
    for(auto &c:s)
    {
        if(c^48) {c--; break;}
        c='9';
    }
    if(s.back()=='0') s.pop_back();
    reverse(s.begin(), s.end());

}

int main()
{
    cin>>a>>b;
    reduce(a);
    reverse(b.begin(), b.end());
    reverse(a.begin(), a.end());
    while(a.size()<b.size()) a.push_back('0');
    calc(b, b.size()-1, 1);
    calc(a, a.size()-1, -1);
    for(int i=b.size()-1;~i;i--)
    {
        tag[i]=(tag[i]+tag[i+1])%mod;
        for(int j=0;j<10;j++)
            cnt[i][j]=(cnt[i][j]+tag[i])%mod;
    }
    int64_t ans=0;
    for(int i=b.size()-1;~i;i--)
        for(int j=0;j<10;j++)
            for(int k=j+1;k<10;k++)
                ans=(ans+(k-j)*cnt[i][j]%mod*cnt[i][k])%mod;
    cout<<ans*2%mod;
}

标签:cnt,int,题解,sum,COCI2013,ret,int64,PAROVI,mod
From: https://www.cnblogs.com/redacted-area/p/18514171

相关文章

  • [GXYCTF 2019]Ping Ping Ping 题解(多种解题方式)
    知识点:命令执行linux空格绕过反引号绕过      变量绕过         base64编码绕过打开页面提示"听说php可以执行系统函数?我来康康"然后输入框内提示输入bjut.edu.cn  输入之后回显信息,是ping这个网址的信息 输入127.0.0.1因为提示是命令......
  • Educational Codeforces Round 171 (Rated for Div. 2) 题解(A-C)
    EducationalCodeforcesRound171(RatedforDiv.2)题解(A-C)这场ABC全都犯病了(悲伤)目录EducationalCodeforcesRound171(RatedforDiv.2)题解(A-C)目录A.PerpendicularSegmentsB.BlackCellsC.ActionFiguresA.PerpendicularSegments大意给你一个......
  • [CodeForces] CF520 题解
    A.Pangram【题目大意】给定一个字符串,询问是否所有英文字符(a到z)都在这个字符串中出现过,不区分大小写。【解题思路】开个桶记录字符是否出现过,最后遍历桶,如果发现有一个没出现就输出NO,否则就输出YES。注意不区分大小写!B.TwoButtons【题目大意】给定两个正整数\(n\)......
  • Educational Codeforces Round 171 (Rated for Div. 2)题解记录
    比赛链接:https://codeforces.com/contest/2026A.PerpendicularSegments题目说了必定有答案,直接对角线即可#include<iostream>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#include<deque>#include<......
  • [ARC186E] Missing Subsequence 题解
    Description给定一个整数序列\(\left(X_1,\ldots,X_M\right)\),其长度为\(M\),元素取值为\(1,\ldots,K\)。要求找出长度为\(N\)的序列\((A_1,\ldots,A_N)\)的数量,元素取值为\(1,\ldots,K\),并满足以下条件,结果取模\(998244353\):在所有长度为\(M\)的序列中,唯......
  • ybtoj题解索引
    密码:sunxuhetai2009第一章-递推算法A.错排问题B.传球游戏C.数的划分D.栈的问题E.求f函数F.划分数列G.无限序列......
  • 题解:P3352 [ZJOI2016] 线段树
    首先,题目上说让期望乘上\((\frac{n(n+1)}{2})^q\)的目的就是让我们求方案数与值的乘积。然后我们考虑在操作过后一个位置上的值相对于原来的值肯定是不降的,于是可以想到对每一个值\(v\),原序列中所有\(\lev\)的元素一定构成了若干连续的区间。对每一个这样的区间而言,操作过......
  • P6803 星际迷航 题解
    P6803星际迷航题解题目大意给定一颗\(N\)个节点的树。这样的树有\(D+1\)层,编号从\(0\)到\(D\)。对于\(i=0,1,\dots,D-1\),需要选择第\(i\)层的任意一个节点向第\(i+1\)层的任意一个节点连一条有向边。最初人在第\(0\)层图的\(1\)号节点。两个玩家交替选择下一......
  • CF1249F Maximum Weight Subset 题解 / 长链剖分复习
    CF1249FMaximumWeightSubset题解题目大意给定一个\(n\)个节点的树,每个节点有点权\(a_i\)。从中选出若干节点,要求这些点两两之间距离大于给定常数\(k\),使得点权和最大。Solve给出一种线性做法。前置知识:长链剖分优化DP。考虑一个DP:设\(f(u,d)\)表示在\(u\)的子......
  • Codeforces Round 982 (Div. 2) 10.26 (ABC)题解
    CodeforcesRound982(Div.2)10.26(ABC)题解A.RectangleArrangement数学(math)题意:有一个无限长宽的方形网格,初始为白色,现在有\(n\)个印章,每个印章有自己的宽\(w_i\)和高\(h_i\)。印章会使得网格涂色,变成黑色。这\(n\)个印章都需要使用一次,需要求解出最后网格中黑色......