NC213184. 锯锯锯锯锯锯锯锯锯锯锯锯锯锯
描述
输入描述
第一行输入一个整数值n,代表你总共要处理n组数据。(1≤n≤1×105)接下来n行,每行两个整数x和y,代表两个学长喊对方“锯锯”的次数。(0≤x,y≤1×108)(每组数据开始的时候,两个学长的码力值均为1)
输出描述
输出n行,每行一个整数,代表码力值高的学长的码力值除以另一个学长的码力值。由于这个比值可能非常大,因此输出这个比值对1e9+7取模的结果。
示例1
输入:
4 0 0 0 1 5 2 0 100000000
输出:
1 2 543907 47004411
C++(clang++11) 解法, 执行用时: 69ms, 内存消耗: 2140K, 提交时间: 2020-10-25 15:40:25
#include<stdio.h> typedef long long ll; const int mod = 1e9 + 7; const int maxn = 1e5 + 10; ll a[maxn]; ll chen(ll a,ll b){ int j=1; while(b!=0){ if(b%2==1)j=(j*a)%mod; a=(a*a)%mod; b=b/2; } return j%mod; } void get() { a[0]=1; for(int i=1;i<maxn;i++){ a[i]=a[i-1]*(a[i-1]+1)%mod; } } int main(void) { ll n; scanf("%lld",&n); get(); while(n--){ ll c,b; scanf("%lld%lld",&c,&b); if(c<b){ ll t=c;c=b;b=t; } if(c>2*45067){ c=c%45067; c+=45067; } if(b>2*45067){ b=b%45067; b+=45067; } printf("%lld\n",a[c]*chen(a[b],mod-2)%mod); } }