小a与黄金街道
【题目描述】
小a和小b来到了一条布满了黄金的街道上。它们想要带几块黄金回去,然而这里的城管担心他们拿走的太多,于是要求小a和小b通过做一个游戏来决定最后得到的黄金的数量。
游戏规则是这样的:
假设道路长度为n米(左端点为0,右端点为n),同时给出一个数k(下面会提到k的用法)
设小a初始时的黄金数量为A,小b初始时的黄金数量为B小a从1出发走向n−1,小b从n−1出发走向1,两人的速度均为1m/s
假设某一时刻(必须为整数)小a的位置为x,小b的位置为y,若gcd(n,x)=1且gcd(n,y)=1,那么小a的黄金数量A会变为A∗kx(kg),小b的黄金数量B会变为B∗ky(kg)当小a到达n−1时游戏结束
小a想知道在游戏结束时A+B的值
答案对10^9+7取模【输入描述】
一行四个整数n,k,A,B
【输出描述】
输出一个整数表示答案
【样例】
示例1
输入
4 2 1 1
输出
32示例2
输入
5 1 1 1
输出
2
思路:
若 GCD(n,x)=1,那么 GCD(n,n-x)=1,同时,若在某个位置得到 的贡献,那么一定存在一个位置会获得小于等于
的贡献,且两人贡献相同
将贡献单独写出来:
因此需要考虑如何得到 R 的值,通过题目可知,能产生答案的数一定是与 n 互质的数,也即是欧拉函数的值
由于前 n 个数的欧拉函数的和为 ,因此最终答案为
【源代码】
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<deque>
#include<vector>
#include<set>
#include<map>
#define PI acos(-1.0)
#define E 1e-6
#define INF 0x3f3f3f3f
#define N 10001
#define LL long long
const int MOD=1e9+7;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
using namespace std;
int getPhi(int x){//获取欧拉函数
int res=x;
for(int i=2;i<=sqrt(x+0.5);i++){
if(x%i==0){
res=res/i*(i-1);
while(x%i==0)
x/=i;
}
}
if(x>1)
res=res/x*(x-1);
return res;
}
LL quickPow(LL x,LL a){//快速幂
LL res=1;
while(a){
if(a&1)
res=res*x%MOD;
x=x*x%MOD;
a>>=1;
}
return res;
}
int main(){
int n;
LL a,b,k;
cin>>n>>k>>a>>b;
int phi=getPhi(n);
LL res=quickPow(k,phi/2*n);
res=res*(a+b)%MOD;
cout<<res<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!