题解:P15053 [UOI 2023 II Stage] Land plots
Huangzicheng5 · · 题解
题目传送门
题意:
一块正方形大地块被
- 主对角线:位置
(i,i) 的小矩形,面积记为a_i ; - 副对角线:位置
(i+1,i) 的小矩形,面积记为b_i 。\ 给定p,q ,求位置(p,q) 处小矩形的面积。
思路与代码
看到题觉得是数论,所以推式子。\
定义第
具体实现:
直接做分数连乘会 WA,所以用质因数分解 + 指数累加:
用一个 map<ll,int>e 记录每个质因数的指数。add(x, s) 函数将 add(a[p], 1),再根据 map,将每个质因数按其指数累乘得到答案。\
计算过程可能爆 long long,可以使用 __int128 累乘,最终转回 long long 输出。
code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[1005],b[1005];
map<ll,int>e;
void add(ll x,int s)
{
for(ll d=2;d*d<=x;d++)
while(x%d==0)
{
e[d]+=s;
x/=d;
}
if(x>1)e[x]+=s;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n-1;i++)cin>>b[i];
int p,q;
cin>>p>>q;
add(a[p],1);
if(q>=p)
for(int i=p;i<=q-1;i++)
{
add(b[k],-1);
add(a[k+1],1);
}
else
for(int i=q;i<=p-1;i++)
{
add(b[k],1);
add(a[k+1],-1);
}
bool f=0;
for(auto i:e) if(i.second!=0)f=1;
if(!f)cout<<"1 1\n";
else for(auto i:e) if(i.second!=0)cout<<i.first<<" "<<i.second<<"\n";
return 0;
}