补题:牛客寒假基础训练营1

C-小a与星际探索

https://blog.csdn.net/Z_sea/article/details/86600771

还没看懂。。。。

D-小a与黄金街道

欧拉函数,容斥原理,快速幂取模

n,x互质,且n,y互质,且,n-x=y;

性质:当x和n互质时, n-x一定也和n互质

也就是说,只要满足n与x互质,A和B的数量就会发生变化。

那么ans=A*k^p1*k^p2*...*pn+B*k^pn*k^p(n-1)*...*p1=(A+B)*k^r。(r=p1+...+pn)这里的p1...pn是小于n的所有质因数,欧拉函数。

n的所有质因数之和等于euler(n)*n/2;

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
typedef long long ll;
ll mod=1e9+7;
ll mul(ll a,ll b){
    a%=mod;b%=mod;
    ll c=(long double)a*b/mod;
    ll ans=a*b-c*mod;
    return (ans%mod+mod)%mod;
}
ll pow_mod(ll x,ll n){//快速幂
    ll res=1;
    while(n){
        if(n&1)
        res=mul(res,x);
        x=mul(x,x);
        n>>=1;
    }
    return res;
}
ll euler(ll x){
    ll res=x,a=x;
    for(ll i=2;i*i<=a;i++){
        if(a%i==0){
            res=res-res/i;
            while(a%i==0)a/=i;
        }
    }
    if(a>1)res=res-res/a;
    return res;
}
ll n,k,a,b;
int main(){
    scanf("%lld%lld%lld%lld",&n,&k,&a,&b);
    ll ans=(a+b)%mod;
    ll R=euler(n)*n/2;
    ans=(ans*pow_mod(k,R))%mod;
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/precious-LZY/p/10367186.html