藍橋杯 整數拼接
整數拼接
題目大意
給定一個長度為
n
n
n 的陣列
A
1
,
A
2
,
⋅
⋅
⋅
,
A
n
A_1,A_2,⋅⋅⋅,A_n
A1,A2,⋅⋅⋅,An。
你可以從中選出兩個數
A
i
A_i
Ai 和
A
j
A_j
Aj(
i
i
i 不等於
j
j
j),然後將
A
i
A_i
Ai 和
A
j
A_j
Aj 一前一後拼成一個新的整數。
例如 12 和 345 可以拼成 12345 或 34512。
注意交換
A
i
A_i
Ai 和
A
j
A_j
Aj 的順序總是被視為 2 種拼法,即便是
A
i
=
A
j
A_i=A_j
Ai=Aj 時。
請你計算有多少種拼法滿足拼出的整數是
K
K
K 的倍數。
輸入格式
第一行包含 2 個整數
n
n
n 和
K
K
K。
第二行包含
n
n
n 個整數
A
1
,
A
2
,
⋅
⋅
⋅
,
A
n
A_1,A_2,⋅⋅⋅,A_n
A1,A2,⋅⋅⋅,An。
輸出格式
一個整數代表答案。
資料範圍:
1
≤
n
≤
1
0
5
,
1
≤
K
≤
1
0
5
,
1
≤
A
i
≤
1
0
9
1≤n≤10^5,1≤K≤10^5,1≤A_i≤10^9
1≤n≤105,1≤K≤105,1≤Ai≤109
輸入樣例
4 2
1 2 3 4
輸出樣例
6
暴力程式碼 O ( n 2 ) O(n^2) O(n2)
ll ans = 0;
ll num[11]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
if(i!=j)
{
int leni = get_len(a[i]), lenj = get_len(a[j]);
ll t = a[i]*num[lenj]+a[j];
if(t%k==0) ans++;
t = a[j]*num[leni]+a[i];
if(t%k==0) ans++;
}
}
所謂的優化就是空間換時間,外層迴圈無法去掉,那麼我們就想辦法去掉內層迴圈的東西。
a
[
i
]
g
e
t
l
e
n
(
a
[
j
]
)
a[i]^{getlen(a[j])}
a[i]getlen(a[j])+
a
[
j
]
a[j]
a[j]
拆成兩部分 a[i]*10^(getlen(a[j])) 和 a[j]
(k-a[j]%k)%k //放在後面符合拼接數的個數
for(int t = 1, j = 0; j <= 10; j++)
{
cnt[j][a[i]*t%k]++; //放在前面
t = t*10%k;
}
j <= 10 是因為 get_len獲取的長度1e9是10位,所以 j 要遍歷完二維維所有資料需要注意 j >= 10,但是也不能太大。然後翻轉陣列再求一次就是我們最終需要的結果
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
ll a[maxn], n, k, ans = 0;
ll cnt[15][maxn]; //cnt[i][j]存乘以10^i%k餘數是j的數
int get_len(int x) //獲取字元長度
{
int res = 0;
while(x)
{
res++;
x /= 10;
}
return res;
}
void solve()
{
memset(cnt, 0 ,sizeof cnt); //清0
for(int i = 0; i < n; i++)
{
ans += cnt[get_len(a[i])][(k - a[i]%k)%k]; //a[i]放在後面
for(int t = 1,j = 0; j < 11; j++)
{
cnt[j][t*a[i]%k]++; //a[i]放在前面
t = t*10%k;
}
}
}
int main()
{
scanf("%d%d",&n,&k);
for(int i = 0; i < n; i++) scanf("%lld",&a[i]);
solve();
reverse(a,a+n);
solve();
printf("%lld\n",ans);
return 0;
}
相關文章
- 藍橋杯:基礎練習 查詢整數
- 藍橋杯-帶分數
- 藍橋杯-排列序數
- 2017年藍橋杯A組-分巧克力(整數二分)
- 【藍橋杯考前突擊】第十一屆藍橋杯校賽模擬C/C++ 正整數序列C++
- 藍橋杯
- 藍橋杯-波動數列
- 藍橋杯-合併數列
- 藍橋杯-買不到的數目
- 藍橋杯-連號區間數
- 藍橋杯-子 2023 / 雙子數
- 藍橋杯真題:純質數
- 藍橋杯——特別數的和
- 藍橋杯 買瓜
- 藍橋杯-分巧克力
- 藍橋杯-N皇后
- 藍橋杯真題
- 藍橋杯 剪格子
- 藍橋杯之帶分數(全排列+暴力)
- 藍橋杯:入門訓練 Fibonacci數列
- 閒聊藍橋杯JAVA - 生成迴文數Java
- 藍橋杯-長草(BFS)
- 藍橋杯-螞蟻感冒
- 藍橋杯-翻硬幣
- 藍橋杯-座次問題
- 藍橋杯-日期問題
- 藍橋杯 計算方程
- 如何準備藍橋杯
- 藍橋杯年號字串字串
- 藍橋杯考點整理
- 藍橋杯 分巧克力(Java)Java
- 藍橋杯訓練2
- 藍橋杯注意的地方
- 藍橋杯-M次方根(實數二分)
- 【每週例題】藍橋杯 C++ 多數C++
- [藍橋杯][演算法提高VIP]大數加法演算法
- 藍橋杯 (java)演算法訓練 數對Java演算法
- 2017年藍橋杯javaB組——等差素數列Java