链接:
https://www.nowcoder.com/acm/contest/110/A
来源:牛客网
来源:牛客网
题目描述
这题要你回答T个询问,给你一个正整数S,若有若干个正整数的和为S,则这若干的数的乘积最大是多少?请输出答案除以2000000000000000003(共有17 个零) 的余数。
举例来说,当 S = 5 时,若干个数的和为 5 的情形有以下 7 种(不考虑数字的顺序的话):
1. 1 + 1 + 1 + 1 + 1
2. 1 + 1 + 1 + 2
3. 1 + 1 + 3
4. 1 + 2 + 2
5. 1 + 4
6. 2 + 3
7. 5
他们的乘积依序为:
1. 1 * 1 * 1 * 1 * 1 = 1
2. 1 * 1 * 1 * 2 = 2
3. 1 * 1 * 3 = 3
4. 1 * 2 * 2 = 4
5. 1 * 4 = 4
6. 2 * 3 = 6
7. 5 = 5
其中乘积最大的是 2 * 3 = 6。
举例来说,当 S = 5 时,若干个数的和为 5 的情形有以下 7 种(不考虑数字的顺序的话):
1. 1 + 1 + 1 + 1 + 1
2. 1 + 1 + 1 + 2
3. 1 + 1 + 3
4. 1 + 2 + 2
5. 1 + 4
6. 2 + 3
7. 5
他们的乘积依序为:
1. 1 * 1 * 1 * 1 * 1 = 1
2. 1 * 1 * 1 * 2 = 2
3. 1 * 1 * 3 = 3
4. 1 * 2 * 2 = 4
5. 1 * 4 = 4
6. 2 * 3 = 6
7. 5 = 5
其中乘积最大的是 2 * 3 = 6。
输入描述:
输入的第一行有一个正整数 T,代表该测试数据含有多少组询问。 接下来有 T 行,每个询问各占 1 行,包含 1 个正整数,代表该询问的 S 值。
输出描述:
对于每个询问,请输出答案除以 2000000000000000003(共有17个零) 的余数。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=2000000000000000003;
long long multi(long long a, long long b, long long c)
{
long long ret = 0;
while(b)
{
if(b & 1)
{
ret += a;
if(ret >= c)
ret -= c;
}
a += a;
if(a >= c) a -= c;
b >>= 1;
}
return ret;
}
long long quick_pow(long long a, long long b, long long c)//a^b mod c
{
long long ret = 1;
a %= c;
for (; b; b >>= 1, a = multi(a, a, c))
if (b & 1)
ret = multi(ret, a, c);
return ret;
}
int main()
{
int T;
cin>>T;
while(T--)
{
ll n;
cin>>n;
if(n==1){
cout<<1<<endl;
continue;
}
if(n==2){
cout<<2<<endl;
continue;
}
ll k;
ll ans=1;
if(n%3==0)
{
ans=quick_pow(3,n/3,mod);
cout<<ans<<endl;
continue;
}
else if(n%3==1){
ll x=n-4;
if(x==0){
x=0;
}
else x=x/3;
ll ans=quick_pow(3,x,mod);
ans=((ans*4)%mod+mod)%mod;
cout<<ans<<endl;
continue;
}
else{
ll x=n/3;
ans=quick_pow(3,x,mod);
ans=((ans*2)%mod+mod)%mod;
cout<<ans<<endl;
continue;
}
}
return 0;
}