牛客寒假算法基础集训营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 }

 

posted @ 2019-01-23 18:46  *starry*  阅读(194)  评论(0编辑  收藏  举报