牛客寒假算法基础集训营1 D 小a与黄金街道
小a与黄金街道
链接:https://ac.nowcoder.com/acm/contest/317/D
题解:
附上欧拉函数模板:
(1)直接求小于或等于n,且与n互质的个数:
int Euler(int n)
{
int ret=n;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0)
{
ret=ret/i*(i-1);//先进行除法防止溢出(ret=ret*(1-1/p(i)))
while(n%i==0)
n/=i;
}
if(n>1)
ret=ret/n*(n-1);
return ret;
}
筛选模板:求[1,n]之间每个数的质因数的个数
#define size 1000001
int euler[size];
void Init()
{ memset(euler,0,sizeof(euler));
euler[1]=1;
for(int i=2;i<size;i++)
if(!euler[i])
for(int j=i;j<size;j+=i)
{
if(!euler[j])
euler[j]=j;
euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出
}
}
1 import java.util.Scanner;
2
3 public class Main{
4 static int maxn = 100010;
5 static int [] euler = new int[maxn];
6 /*static void init() {
7 euler[1] = 1;
8 for(int i=2;i<maxn;i++) {
9 if(euler[i]==0) {
10 for(int j=i;j<maxn;j+=i) {
11 if(euler[j]==0) {
12 euler[j] = j;
13 }
14 euler[j] = euler[j]/i*(i-1);
15 }
16 }
17 }
18 }*/
19 static long init(long x) {
20 long ret = x;
21 for(int i=2;i*i<=x;i++) {
22 if(x%i==0) {
23 ret = ret/i*(i-1);
24 while(x%i==0) {
25 x/=i;
26 }
27 }
28 }
29 if(x>1)
30 ret = ret/x*(x-1);
31 return ret;
32 }
33 static long powmod(long a,long b,long mo) {
34 long ans = 1;
35 while(b!=0) {
36 if((b&1)==1) {
37 ans = (ans*a)%mo;
38 }
39 a = (a*a)%mo;
40 b>>=1;
41 }
42 return ans;
43 }
44 public static void main(String[] args) {
45 Scanner cin = new Scanner(System.in);
46 int n,k;
47 long A,B;
48 n = cin.nextInt();
49 k = cin.nextInt();
50 A = cin.nextLong();
51 B = cin.nextLong();
52 long ans = (A+B)*powmod(k, init(n)/2*n, 1000000007)%1000000007;
53 System.out.println(ans);
54 }
55 }