light oj 1236 - Pairs Forming LCM & uva 12546 - LCM Pair Sum

第一题给定一个大数,分解质因数,每个质因子的个数为e1,e2,e3,……em,

则结果为((1+2*e1)*(1+2*e2)……(1+2*em)+1)/2.

代码如下:

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <iostream>
 5 #define M 10000005
 6 #define mod 1000000007
 7 #define ll unsigned long long
 8 using namespace std;
 9 ll prime[M/5],cnt;
10 bool f[M];
11 void init()
12 {
13     int i,j;
14     cnt=0;
15     for(i=2;i<M;i++){
16         if(!f[i]) prime[cnt++]=i;
17         for(j=0;j<cnt&&i*prime[j]<M;j++){
18             f[i*prime[j]]=1;
19             if(i%prime[j]==0) break;
20         }
21     }
22 }
23 ll solve(ll n)
24 {
25     ll ans=1;
26     for(ll i=0;i<cnt&&(ll)prime[i]*prime[i]<=n;i++){
27         if(n%prime[i]==0){
28             ll t=1;
29             n/=prime[i];
30             while(n%prime[i]==0){
31                 t++;
32                 n/=prime[i];
33             }
34             ans*=(ll)(1+t*2);
35         }
36     }
37     if(n>1) ans=3*ans;
38     return (ans+1)/2;
39 }
40 int main()
41 {
42     int t,ca=0;
43     ll n;
44     init();
45     scanf("%d",&t);
46     while(t--){
47         scanf("%llu",&n);
48         printf("Case %d: %llu\n",++ca,solve(n));
49     }
50     return 0;
51 }
View Code

 

 

第二题给定一个数N,其质因子pi及个数ei给定,

则结果为(1+p1+p1^2+……+p1^ei+ei*p1^ei)*……*(1+pm+pm^2+……+pm^em+em*pm^em)+N.

代码如下:

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <iostream>
 5 #define mod 1000000007
 6 #define ll long long
 7 using namespace std;
 8 ll Pow(ll a,int b)
 9 {
10     ll ans=1;
11     while(b){
12         if(b&1) ans=(ans*a)%mod;
13         b>>=1;
14         a=(a*a)%mod;
15     }
16     return ans;
17 }
18 ll sum(ll a,int b)
19 {
20     if(b==0) return 1;
21     if(b&1) return (1+Pow(a,(b+1)/2))*sum(a,b/2)%mod;
22     else return ((1+Pow(a,b/2+1))*sum(a,b/2-1)%mod+Pow(a,b/2))%mod;
23 }
24 int main()
25 {
26     int t,ca=0,n,p,e;
27     scanf("%d",&t);
28     while(t--){
29         scanf("%d",&n);
30         ll ans=1,xx,num=1;
31         for(int i=0;i<n;i++){
32             scanf("%d%d",&p,&e);
33             xx=Pow(p,e);
34             num=(num*xx)%mod;
35             xx=(xx*e)%mod;
36             xx=(xx+sum(p,e))%mod;
37             ans=(ans*xx)%mod;
38         }
39         printf("Case %d: %lld\n",++ca,(ans+num)%mod);
40     }
41     return 0;
42 }
View Code

 

 

 

转载于:https://www.cnblogs.com/xin-hua/p/3351598.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值