1240.北望村小卖部
Description
陆历川住在北望村,村头的小卖部是陆历川经常去的地方,一天陆历川来到小卖部
老板:“买啥子呦?”
陆历川:“买锤子撒。”
老板:“啥子类型的锤子呦?”
吧啦吧啦一顿说,陆历川挑好了要买的锤子,一共是4块钱,但是这个小卖部的老板总是喜欢搞一些优惠。
今天的优惠方式是,收取的金额为该金额除了其自身以外的最大因子,因为陆历川可以分多次付款,所以他可以把这次的钱分两次付款
每次付款金额是2元,这样的话他就可以利用优惠,使自己花2元就可以买到锤子了。
现在陆历川想知道,给定任意金额,他最后最少要交多少钱给老板
Input
输入金额n(2 <= n <= 1e8)
Output
题目要求
2 3 4
Sample Output
1 1 2
Source
Unknown
你可知哥德巴赫猜想~~任意一个偶数可拆分成两个质数~~所以当所需的钱n,n%2==0,分别分成两个质数交就好~这样就是2块~当n%2==1时候,如果n能拆封成、2和一个质数~那么就是交2块,~~~不然就只能拆成一个质数(3)和一个偶数,而哪个偶数又能拆成2个质数,这样就是3块~~别忘了2和3的特殊判断;
而在这个题中对于怎样快速判断一个数是否是质数~~一种是用mr函数直接判断~~另一种的话可以看这篇博客:https://blog.csdn.net/huang_miao_xin/article/details/51331710的第三个方法~~。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long int
ll gcd(ll x, ll y)
{
if (!y)
{
// cout << "Asd" << endl;
return x;
}
return (y, x%y);
}
ll pow(ll a, ll x, ll mod)//要用到快速幂
{
ll ans = 1;
while (x)
{
if (x & 1)
{
(ans *= a) %= mod;
}
(a *= a) %= mod;
x = x / 2;
}
return ans;
}
bool mr(ll x)
{
if (x == 2)
{
return true;
}
if (x == 1)
{
return 0;
}
for (ll s = 1; s <= 10; s++)//40次判断就行了
{
// cout << s << endl;
ll now = rand() % (x - 2) + 2;
if (pow(now, x - 1, x) != 1)
{
return 0;
}
}
return 1;
}
int main()
{
ll x;
while (~scanf("%lld", &x))
{
if (x == 2)
{
cout << "1" << endl;
continue;
}
if (x % 2 == 0)
{
cout << "2" << endl;
}
else
{
if (mr(x))
{
cout << "1" << endl;
}
else
{
if (mr(x - 2))
{
cout << "2" << endl;
}
else
{
cout << "3" << endl;
}
}
}
}
return 0;
}