Codeforces 615D Multipliers (数论)

题目链接 Multipliers

题意很明确。

很显然答案可以表示成X ^ EXP % MOD

首先我们令N为输入的n个数的乘积。并且设N = (P1 ^ C1) * (P2 ^ C2) * ... * (Pk * Ck),Pi(1 <= i <= k)为质数。

1、N为完全平方数。

   这个时候X = N的算术平方根,EXP = (C1 +1) * (C2 + 1) * ... * (Ck + 1), MOD = 1e9 + 7;

2、N不是完全平方数。

   这个时候X = N, EXP = (C1 +1) * (C2 + 1) * ... * (Ck + 1) / 2, MOD = 1e9 + 7;

考虑到EXP可能非常大,这里我用了指数循环节公式:

 a^b%c = a^( b%phic+phic )%c phix为欧拉函数。

而在题中c等于1e9 + 7为质数,那么phic = 1e9 + 6。

剩下的事情就很简单了。

 

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define rep(i, a, b)  for(int i(a); i <= (b); ++i)
 6 #define LL            long long
 7 
 8 const int N     =    200010;
 9 const LL mod    =    1000000007;
10 
11 int prime[N];
12 int c[N], d[N];
13 bool fl;
14 int cnt = 0;
15 int n, x;
16 int squ;
17 
18 map <int, int> mp;
19 
20 
21 inline LL Pow(LL a, LL b, LL Mod){ 
22     LL ret(1); 
23     for (; b; b >>= 1, (a *= a) %= Mod) 
24         if (b & 1) (ret *= a) %= Mod; 
25     return ret;
26 }    
27 
28 
29 int main(){
30 
31     rep(i, 2, 200000){
32         fl = true;
33         rep(j, 2, (int)sqrt(i + 0.5)) if (i % j == 0){
34             fl = false;
35             break;
36         }
37         if (fl){
38             prime[++cnt] = i;
39             mp[prime[cnt]] = cnt;
40         }
41     }
42 
43     memset(c, 0, sizeof c);
44 
45     scanf("%d", &n);
46     rep(i, 1, n){
47         scanf("%d", &x);
48         ++c[mp[x]];
49     }
50 
51     squ = 1;
52     rep(i, 1, cnt)
53         if (c[i]){
54             if (c[i] & 1){
55                 squ = 0;
56                 break;
57             }
58         }
59         
60 
61     LL exp = 1;
62     if (squ){
63         LL ret = 1;
64         rep(i, 1, cnt) d[i] = c[i] / 2;
65         rep(i, 1, cnt) ++c[i];
66         rep(i, 1, cnt) (exp *= c[i]) %= (mod - 1);
67 
68         rep(i, 1, cnt) if (d[i]) (ret *= Pow(prime[i], d[i], mod)) %= mod;
69 
70         printf("%lld\n", Pow(ret, exp + mod - 1, mod));    
71     }
72 
73     else
74     {
75         rep(i, 1, cnt) d[i] = c[i] + 1;
76         rep(i, 1, cnt) if (d[i] % 2 == 0){
77             d[i] >>= 1;
78             break;
79         }
80 
81         LL exp = 1;
82         rep(i, 1, cnt) (exp *= d[i]) %= (mod - 1);
83         LL ret = 1;
84         rep(i, 1, cnt) if (c[i]) (ret *= Pow(prime[i], c[i], mod)) %= mod;
85         
86         printf("%lld\n", Pow(ret, exp + mod - 1, mod));
87     }
88     
89 
90     return 0;
91 
92 }

 

转载于:https://www.cnblogs.com/cxhscst2/p/6397196.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽B代驾管理系统对代驾订单管理、用户咨询管理、代驾订单评价管理、代驾订单投诉管理、字典管理、论坛管理、公告管理、新闻信息管理、司机管理、用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行辽B代驾管理系统程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。辽B代驾管理系统的开发让用户查看代驾订单信息变得容易,让管理员高效管理代驾订单信息。 辽B代驾管理系统具有管理员角色,用户角色,这几个操作权限。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看代驾订单,删除代驾订单操作,新增代驾订单操作,修改代驾订单操作。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。新闻管理页面,此页面提供给管理员的功能有:新增新闻,修改新闻,删除新闻。新闻类型管理页面,此页面提供给管理员的功能有:新增新闻类型,修改新闻类型,删除新闻类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值