ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

《整数拼接》

2022-01-24 09:34:04  阅读:106  来源: 互联网

标签:typedef const int LL long 拼接 整数 define


https://www.acwing.com/problem/content/description/2070/:

首先我们考虑两个数拼接:a[i] + a[j] 实际上就是$a[i] * 10^{length(a[j])} + a[j]$

即有:$a[i] * 10^{length(a[j])} + a[j] mod k == 0$

$a[i] * 10^{length(a[j])} mod k == -a[j] mod k$

也就是说这两者同余k的时候成立,这就很简单了。

我们预处理出长度为10 ^ i时候的每个数作为高位,然后一次性计算即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
const int N = 1e5 + 5;
const int M = 1e7 + 5;
const LL Mod = 998244353;
#define INF 1e14
#define dbg(ax) cout << "now this num is " << ax << endl;
inline long long ADD(long long x,long long y) {
    if(x + y < 0) return ((x + y) % Mod + Mod) % Mod;
    return (x + y) % Mod;
}
inline long long MUL(long long x,long long y) {
    if(x * y < 0) return ((x * y) % Mod + Mod) % Mod;
    return x * y % Mod;
}
inline long long DEC(long long x,long long y) {
    if(x - y < 0) return (x - y + Mod) % Mod;
    return (x - y) % Mod;
}

int n;
LL pw[20],cnt[20][N],mod,a[N];
void init() {
    pw[0] = 1;
    for(int i = 1;i <= 10;++i) pw[i] = pw[i - 1] * 10;
}
int get_len(int x) {
    int len = 0;
    while(x) {
        len++;
        x /= 10;
    }
    return len;
}
void solve() {
    scanf("%d %d",&n,&mod);
    for(int i = 1;i <= n;++i) scanf("%lld",&a[i]);
    for(int i = 1;i <= 10;++i) {
        for(int j = 1;j <= n;++j) {
            int ma = a[j] % mod * pw[i] % mod;
            cnt[i][ma]++;
        }
    }
    LL ans = 0;
    for(int i = 1;i <= n;++i) {
        int len = get_len(a[i]);
        int tmp = (-a[i] % mod + mod) % mod;
        LL ss = a[i] % mod * pw[len] % mod;
        ans += cnt[len][tmp];
        if(ss % mod == tmp) ans--;
    }
    printf("%lld\n",ans);
}   
int main() {
    init();
    // int _;
    // for(scanf("%d",&_);_;_--) {
        solve();
    //}
    system("pause");
    return 0;
}
View Code

https://www.acwing.com/problem/content/1232/

这题也是个关于模数的题:不过比较简单用经典的前缀和取模即可计算。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
const int N = 1e5 + 5;
const int M = 1e7 + 5;
const LL Mod = 998244353;
#define INF 1e14
#define dbg(ax) cout << "now this num is " << ax << endl;
inline long long ADD(long long x,long long y) {
    if(x + y < 0) return ((x + y) % Mod + Mod) % Mod;
    return (x + y) % Mod;
}
inline long long MUL(long long x,long long y) {
    if(x * y < 0) return ((x * y) % Mod + Mod) % Mod;
    return x * y % Mod;
}
inline long long DEC(long long x,long long y) {
    if(x - y < 0) return (x - y + Mod) % Mod;
    return (x - y) % Mod;
}

int n,k,a[N],cnt[N];
void solve() {
    scanf("%d %d",&n,&k);
    for(int i = 1;i <= n;++i) scanf("%d",&a[i]);
    int sum = 0;
    LL ans = 0;
    for(int i = 1;i <= n;++i) {
        sum += a[i];
        sum %= k;
        ans += cnt[sum];
        cnt[sum]++;
        if(sum == 0) ans++;
    }
    printf("%lld\n",ans);
}   
int main() {
    // int _;
    // for(scanf("%d",&_);_;_--) {
        solve();
    //}
    system("pause");
    return 0;
}
View Code

 

标签:typedef,const,int,LL,long,拼接,整数,define
来源: https://www.cnblogs.com/zwjzwj/p/15838197.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有