CF 647E Johnny and Grandmaster

在这里插入图片描述
在这里插入图片描述
注意随意取模的那个数全程也要用那个模数,计算qpow,不然会出错

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <deque>
#include <stack>
#include <cctype>
using namespace std;
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecl;
typedef pair<int, int> pii;
template <class T>
inline void read(T &ret) {
    char c;
    int sgn;
    if (c = getchar(), c == EOF) return ;
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    sgn = (c == '-') ? -1:1;
    ret = (c == '-') ? 0:(c - '0');
    while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
    ret *= sgn;
    return ;
}
int xxxxxxxxx = 1;
inline void outi(int x) {if (x > 9) outi(x / 10);putchar(x % 10 + '0');}
inline void outl(ll x) {if (x > 9) outl(x / 10);putchar(x % 10 + '0');}
inline void debug(ll x) {cout << xxxxxxxxx++ << " " << x << endl;}
inline void debugs(string s) {cout << s << endl;}
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int modn = 1e8 + 6;
ll k[maxn];
ll quickpow(ll a, ll b, ll mod) {
    ll ans = 1, base = a;
    while (b) {
        if (b & 1) ans = ans * base % mod;
        base = base * base % mod;
        b >>= 1;
    }
    return ans;
}
bool cmp(ll a, ll b) {return a > b;}
int main() {
    int t;
    read(t);
    while (t--) {
        ll n, p, x;
        read(n), read(p);
        for (int i = 1; i <= n; i++) read(k[i]);
        ll ans = 0, ansn = 0;
        sort(k + 1, k + n + 1, cmp);
        for (int i = 1; i <= n; i++) {
            if (ans == 0 && ansn == 0) ans += quickpow(p, k[i], mod), ansn += quickpow(p, k[i], modn);
            else {
                ans = (ans - quickpow(p, k[i], mod) + mod) % mod;
                ansn = (ansn - quickpow(p, k[i], modn) + modn) % modn;
            }
        }
        outl(ans);
        putchar('\n');
    }
    return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值