Prime pair connection (Project Euler 134)

题目大意:

对于连续的质数$p1$, $p2$, 满足$5 <= p1 <= 1000000$ 求出最小的整数$S$, 它以 $p1$结尾并且能够被$p2$整除。 求$S$的和。

 

思路:

只需要知道对于一对$p1$, $p2$怎么求对应的$S$.   把$S$表示成$x*10^k+p1$ 其中$k$是$p1$的长度。

然后就转化为求同余方程 $x*10^k+p1\equiv 0\ (mod\ p2)$

 

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <set>
 6 #include <cstring>
 7 #include <map>
 8 #include <queue>
 9 using namespace std;
10 
11 typedef long long ll;
12 #define N 10000000
13 #define M 1100
14 typedef pair<int,int> pii;
15 
16 
17 bool flag[N];
18 int p[N],phi[N];
19 
20 
21 void Get_Primes(int lim)
22 {
23     phi[1]=1;
24     for (int i=2;i<=lim;i++)
25     {
26         if (!flag[i]) p[++p[0]]=i,phi[i]=i-1;
27         for (int j=1;j<=p[0] && i*p[j]<=lim;j++)
28         {
29             flag[i*p[j]]=true;
30             if (i%p[j]==0) 
31             {
32                 phi[i*p[j]]=phi[i]*p[j];
33                 break;
34             }
35             else phi[i*p[j]]=phi[i]*(p[j]-1);
36         }
37     }
38 }
39 
40 ll Power(ll x, ll P, ll mod)
41 {
42     ll res = 1;
43     for (; P ; P >>= 1)
44     {
45         if (P & 1) res = res * x % mod;
46         x = x * x % mod;
47     }
48     return res;
49 }
50 
51 
52 ll Solve(ll p1, ll p2)
53 {
54     ll tmp = p1, t = 1;
55     while (tmp) tmp /= 10, t *= 10;
56     ll x = (p2 - p1) * Power(t, p2 - 2, p2) % p2; 
57     return x * t + p1;
58 }
59 
60 int main()
61 {
62     freopen("in.in","r",stdin);
63     freopen("out.out","w",stdout);
64 
65     ll res = 0;
66     Get_Primes(10000000); 
67     for (int i = 3; p[i] <= 1000000; ++i) res += Solve(p[i], p[i + 1]);
68     cout << res << endl;
69     return 0;
70 }
View Code

答案:18613426663617118

转载于:https://www.cnblogs.com/vb4896/p/6767077.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值