链接:https://ac.nowcoder.com/acm/contest/85/C
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
毕竟是元宵节,晚上还是要吃几个元宵。 Etéreo 家可是个大家庭,元宵的数量,甚至是餐具的数量,都多的惊人。现在,爱数学的 Etéreo 又来问你有趣的数学题了,快来秒掉它! Etéreo 家里有 ς\varsigmaς 种元宵馅, ϑ\varthetaϑ 种元宵皮,每个元宵可以选择任意一种元宵馅和任意一种元宵皮。同时有 ϖ\varpiϖ 张桌子,每张桌子上放了 ϱ\varrhoϱ 只碗,每只碗能放一只元宵。每只碗都要装一只元宵。Etéreo 会告诉你 ς,ϑ,ϖ,ϱ\varsigma, \vartheta, \varpi, \varrhoς,ϑ,ϖ,ϱ 的值,想请问你有多少种装元宵的方式。答案对 Λ\LambdaΛ 取模。
两种方式被认为是不同的当且仅当至少有一只碗存在于两种方式的同一个位置但是里面有至少一个元宵不同。
两个元宵被认为是不同的当且仅当元宵馅不同或者元宵皮不同。
碗和桌子都是有编号的,但是你不能改变碗或桌子的编号。
你可以认为碗和桌子都是固定的,你只能改变元宵的种类和位置。
输入描述:
输入共一行,五个整数 ς,ϑ,ϖ,ϱ,Λ\varsigma, \vartheta, \varpi, \varrho, \Lambdaς,ϑ,ϖ,ϱ,Λ ,意义同题目描述。
输出描述:
每行一个整数,表示答案。
示例1
输入
复制
1 2 1 3 998244353
输出
复制
8
备注:
0≤ς,ϑ≤10180 \leq \varsigma, \vartheta \leq 10^{18}0≤ς,ϑ≤10^18 0≤ϖ,ϱ≤1060 \leq \varpi, \varrho \leq 10^60≤ϖ,ϱ≤10^6 1≤Λ≤1,000,000,0071 \leq \Lambda \leq 1,000,000,0071≤Λ≤1,000,000,007
题解:
设元宵馅为啊,元宵皮为b,桌子编号为c,碗的编号为d,取模数为e。
由样例可以确定题目所求答案为(a*b)的(c*d)次方%e(也只有这个解释说得通)。
那么你求个次方取个模不就行了吗?no,看下数据范围。首先c,d 的范围是10^6,那么所求数可能要乘10^12次,显然光靠循环是解决不了的,这时候就要用到快速幂。这时候再观察一下a,b的范围10^18,显然这么大的数去快速幂是很麻烦的,那么在进行快速幂之前我们就要把快速幂的第一个参数取余,让它尽可能小。
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a,b,c,d,e;
ll quickpower(ll a,ll n)
{
ll res=1;
while(n)
{
if(n&1) res=res*a%e;
a=a*a%e;
n>>=1;
}
return res;
}
int main(){
// freopen("input.txt","r",stdin);
std::ios::sync_with_stdio(false);
cin>>a>>b>>c>>d>>e;
a%=e,b%=e;//a,b取模在快速幂前让第一个参数尽可能小
if(e==1) cout<<"0";//特殊情况,任何情况下如果模数为1,那么结果就为0
else cout<<quickpower(a*b%e,c*d);//a,b取模在快速幂前让第一个参数尽可能小,这里c*d决不能取模,因为尽管它的值大于了模数,当时它是次方啊,是第一个参数的多少次方,怎么能缩减呢?
return 0;
}