Math Problem

                                                                                            E-Math Problem

## 题面翻译

**【题目描述】**

给定两个正整数 nk,您可以进行以下两种操作任意次(包括零次):

- 选择一个整数 x 满足 0x<k,将 n 变为 kn+x。该操作每次花费 a 枚金币。每次选择的整数 x 可以不同。
- 将 n 变为 nk。该操作每次花费 b 枚金币。其中 nk 表示小于等于 nk 的最大整数。

给定正整数 m,求将 n 变为 m 的倍数最少需要花费几枚金币。请注意:0 是任何正整数的倍数。

**【输入格式】**

有多组测试数据。第一行输入一个整数 T1T105)表示测试数据组数。对于每组测试数据:

第一行输入五个正整数 nkmab1n10181k,m,a,b109)。

**【输出格式】**

每组数据输出一行一个整数,代表将 n 变为 m 的倍数最少需要花费几枚金币。如果无法完成该目标,输出 1

**【样例解释】**

对于第一组样例数据,一开始 n=101,最优操作如下:

- 首先进行一次第二种操作,将 n 变为 n4=25,花费 5 枚金币。
- 接下来进行一次第一种操作,选择 x=3,将 n 变为 4n+3=103,花费 3 枚金币。
- 接下来进行一次第一种操作,选择 x=2,将 n 变为 4n+2=414,花费 3 枚金币。
- 此时 414=2×207,满足 nm 的倍数。共花费 5+3+3=11 枚金币。

对于第二组样例数据,进行两次第二种操作将 n 变为 0。共花费 1+1=2 枚金币。

对于第三组样例数据,因为 n=114=6×19 已经是 m 的倍数,因此无需进行任何操作。共花费 0 枚金币。

## 题目描述

Given two positive integers n and k, you can perform the following two types of operations any number of times (including zero times):

- Choose an integer x which satisfies 0x<k, and change n into kn+x. It will cost you a coins to perform this operation once. The integer x you choose each time can be different.
- Change n into nk. It will cost you b coins to perform this operation once. Note that nk is the largest integer which is less than or equal to nk.

Given a positive integer m, calculate the minimum number of coins needed to change n into a multiple of m. Please note that 0 is a multiple of any positive integer.

## 输入格式

There are multiple test cases. The first line of the input contains an integer T (1T105) indicating the number of test cases. For each test case:

The first line contains five integers n, k, m, a, b (1n1018, 1k,m,a,b109).

## 输出格式

For each test case output one line containing one integer, indicating the minimum number of coins needed to change n into a multiple of m. If this goal cannot be achieved, output 1 instead.

## 样例 #1

### 样例输入 #1

```
4
101 4 207 3 5
8 3 16 100 1
114 514 19 19 810
1 1 3 1 1
```

### 样例输出 #1

```
11
2
0
-1
```

## 提示

For the first sample test case, initially n=101. The optimal steps are shown as follows:

- Firstly, perform the second type of operation once. Change n into n4=25. This step costs 5 coins.
- Then, perform the first type of operation once. Choose x=3 and change n into 4n+3=103. This step costs 3 coins.
- Then, perform the first type of operation once. Choose x=2 and change n into 4n+2=414. This step costs 3 coins.
- As 414=2×207, n is a multiple of m. The total cost is 5+3+3=11 coins.

For the second sample test case, perform the second type of operation twice will change n into 0. The total cost is 1+1=2 coins.

For the third sample test case, as n=114=6×19 is already a multiple of m, no operation is needed. The total cost is 0 coins.

 

很显然要先除,然后再乘,枚举除的次数,一直到0为止

设一个l,r表示区间,如果说当前的值在这个区间内得到的除数都相同,那就可以继续乘,否则结束,得到结果

复制代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e9+7;
string s;
int n,t,a,b,res,ans,m,k;
bool vis[N];
void solve()
{
    cin>>n>>k>>m>>a>>b;
    if(k==1){
        if(n%m) cout<<-1<<endl;
        else cout<<0<<endl;
        return;
    }
    res=2e18;
    for(int i=0;~i;n/=k,i++){
        if(n==0){
            res=min(res,i*b);
            break;
        }
        __int128_t l=n,r=n;
        int ans=i*b;
        while(l/m==r/m&&l%m){
            l*=k,r=r*k+k-1;
            ans+=a;
        }
        res=min(res,ans);
    }
    cout<<res<<endl;
    return;
}
signed main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
复制代码

 

posted @   o-Sakurajimamai-o  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 因为Apifox不支持离线,我果断选择了Apipost!
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
-- --
点击右上角即可分享
微信分享提示