A - The Euler function 来源:HDU 2824

计算[a,b]区间内的整数的欧拉函数值,需要掌握单个欧拉函数和函数表的使用。

#include <iostream>
#include <cstdio>
using namespace std; const int MAX_N = ;
typedef long long ll;
int phi[MAX_N];
// ll sum_phi[MAX_N]; 若使用前缀和累加,会爆内存(MLE) void phi_table(int n)
{ // 计算得到n以内的欧拉函数表,参考蓝书P121
int i, j;
for(i=;i<=n;i++)
phi[i] = i; for(i=;i<=n;i+=)
phi[i] /= ; for(i=3;i<=n;i+=)
{
if(phi[i]==i)
{
for(j=i;j<=n;j+=i)
phi[j] = phi[j] / i * (i - );
}
}
} int main()
{
phi_table();

// for(int i=1;i<=3000000;i++)
// sum_phi[i] = sum_phi[i-1] + phi[i];

// int a, b;
// while(cin>>a>>b)
// printf("%lld\n", sum_phi[b]-sum_phi[a-1]);

int a, b;
while(cin>>a>>b)
{
ll sum = ;
for(int i=a;i<=b;i++)
sum += phi[i];
printf("%lld\n", sum);
}
return ;
}

B - Divisors  来源:POJ 2992

求组合数C(n, k)的因子个数,0 ≤ k ≤ n ≤ 431。

打表可得431以内的素数只有83个,由于C(n, k) = n!/(k!*(n-k)!) = n*(n-1)*…*(n-k+1)/k!,开始的直观想法是求出分子上的每个素数因子的总个数,再减去分母上出现的每个素数因子的总个数,正约数的个数即为(a1+1)*(a2+1)*…*(an+1)。然而多次提交优化仍然超时。。。最后参考https://www.cnblogs.com/zxhyxiao/p/8026280.html,学到了计算N!中某个素因子个数的计算方法,结合网上的做法,终于AC。

求N!中素因子p的个数,也就是N!中p的幂次

公式为:cnt=[n/p]+[n/p^2]+[n/p^3]+...+[n/p^k]

核心代码:

int cnt = 0;
while(N)
{
  cnt += N/p;
  N /= p;
}
 
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int p[], cnt, num[];
bool notprime[]; void prime_table(int n)
{ // 筛素数
  notprime[] = notprime[] = ;
  int i, j;
  for(i=;i<=n;i++)
  {
    if(!notprime[i])
{
num[i] = cnt;
p[cnt++] = i;
}     for(j=;j<cnt && i*p[j]<n;j++)
    {
      notprime[i*p[j]] = ;
      if(i%p[j]==) break;
    }
  }
} int main()
{ prime_table();
// for(int i=0;i<cnt;i++) cout<<p[i]<<endl;
// cout<<cnt<<endl;
int n, k;
while(scanf("%d %d", &n, &k)!=EOF)
{
long long ans = ;
for(int i=;i<cnt && p[i]<=n;i++)
{
int N = n, cnt = ;
while(N)
{
cnt += N/p[i];
N /= p[i];
}
N = k;
while(N)
{
cnt -= N/p[i];
N /= p[i];
}
N = n-k;
while(N)
{
cnt -= N/p[i];
N /= p[i];
}
ans *= (cnt+);
}
printf("%lld\n", ans);
}
return ;
}

C - Longge's problem 来源:POJ 2480

计算∑gcd(i, N), 1<=i<=N

简单推导可得所求结果为∑i*phi(n/i), i|n.由于n的上限太大(1e18),书上打表的办法失效,一时陷入困境。再次百度参考https://www.cnblogs.com/flipped/p/5690123.html才茅塞顿开,直接采用O(√n)求单个欧拉函数值。需要特别注意注释处,最开始好几次TLE都是因为i*i结果为int类型溢出变为负数,出现了死循环。

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std; typedef long long ll; ll euler(int x)
{ // 计算欧拉函数phi(x)
int res=x, m = (int)sqrt(x+0.5);
for(int i=; i<=m; i++)
if(x%i==)
{
res = res/i*(i-);
while(x%i==) x/=i;
}
if(x>) res = res/x*(x-);
return res;
} int main()
{
ll n, ans;
while(scanf("%lld", &n)!=EOF)
{
ans = ;
int i;
for(i=;i<n/i;i++) // for(i=1;(ll)i*i<n;i++)
{
if(n%i==) ans += i*euler(n/i) + n/i*euler(i);
}
if(i*i==n) ans += i*euler(i);
printf("%lld\n", ans);
}
}

E - Happy 2006 来源:POJ 2773

计算与m互质的第K大的正整数,m (1 <= m <= 1000000), K (1 <= K <= 100000000)

直接上AC代码:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std; int gcd(int a,int b)
{
if(!b) return a;
return gcd(b,a%b);
} int euler(int x)
{
int res=x, m = (int)sqrt(x+0.5);
for(int i=; i<=m; i++)
if(x%i==)
{
res = res/i*(i-);
while(x%i==) x/=i;
}
if(x>) res = res/x*(x-);
return res;
} int main()
{
int m, k;
while(scanf("%d %d", &m, &k)!=EOF)
{
int sum = euler(m);
int t = k % sum, tt = , i;
if(t==) t = sum; //注意整除的处理
for(i=;i<m;i++)
{
if(gcd(i, m)==) tt++;
if(tt==t) break;
} printf("%d\n", i+(k-)/sum*m);
}
}

貌似以上做法的欧拉函数显得多余,直接用gcd判断m以内全部互质的整数,总个数即为sum。

D - GCD & LCM Inverse  来源:POJ 2429

最后AC的D题,参考了网上用dfs得到数组中最接近sqrt(N)的部分元素之积。晚上讲题解时滕佬指明一定要用Miller Rabin算法,直接在其模板基础上修改而来。代码十分长而且显得有些杂乱,日后再做整理吧~~

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <cmath>
#include <algorithm>
using namespace std; typedef long long ll; ll box[];
ll N, T, num; ll min(ll a , ll b)
{
return (a < b) ? a : b;
} ll gcd(ll a , ll b)
{
while(b)
{
ll t = a;
a = b;
b = t % b;
} return a;
} ll tim(ll a , ll b , ll mo)
{
a %= mo;
b %= mo; ll ans = ; while(b)
{
if(b & )
{
ans += a;
if(ans > mo)
ans -= mo;
} b >>= ;
a <<= ; if(a > mo)
a -= mo;
} return ans;
} ll po(ll x , ll n , ll mo)
{
x %= mo;
ll ans = ; while(n)
{
if(n & )
ans = tim(ans , x , mo); x = tim(x , x , mo);
n >>= ;
} return ans;
} bool tes(ll n , ll d , ll t , ll mo)
{ ll y = po(t , n , mo); ll i;
for(i = ; i < d ; i++)
{
ll no = tim(y , y , mo); if(y != mo - && y != && no == )
{
return false;
} y = no;
} if(y != )
{
return false;
} return true;
} bool MR(ll n)
{
if(n < )
return false; if(n == || n == )
return true; if((n & ) == || n % == )
return false; ll b = n - , t = ; while((b & ) == )
{
b >>= ;
t++;
} ll i, ty[] = { , , , , , , , }; for(i = ; i < ; i++)
{
if(!tes(b , t , ty[i] , n) && ty[i] < n)
{
return false;
}
} return true;
} ll Ro(ll n , ll c)
{
srand(time(NULL));
ll x0 = rand() % (n - ) + ; ll x = x0, y = x0, k = , i = , d = ; while(d == )
{
k++;
x = (tim(x , x , n) + c) % n; d = gcd(- * min(x - y , y - x) , n); if(d > && d < n)
return d; if(d == n)
return -; if(k == i)
{
y = x;
i <<= ;
}
}
} void fj(ll n)
{
if(n == )
return; if(MR(n))
{
box[num++] = n;
return;
} ll p = -, c = ; while(p == -)
p = Ro(n , c--); fj(n / p);
fj(p);
} ll fact[], common;
int cnt = ;
void dfs(ll now, int n)
{
if(now>sqrt(N)) return;
common = max(common, now); for(int i=n;i<=cnt;i++) dfs(now*fact[i], i+);
} int main()
{ ll lcm, gcd;
while(scanf("%lld %lld", &gcd, &lcm)!=EOF)
{
N = lcm / gcd; MR(N);
num = ;
fj(N); sort(box, box+num);
// for(int i=0;i<num;i++)
// printf("%lld\n", box[i]); cnt = ;
for(int i=;i<;i++) fact[i] = ;
fact[] = box[];
for(int i=;i<num;i++)
{
if(box[i]==box[i-]) fact[cnt] *= box[i];
else fact[++cnt] = box[i];
}
//for(int i=0;i<=cnt;i++) printf("%lld\n", fact[i]); common = ;
dfs(, );
printf("%lld %lld\n", common*gcd, lcm/common*gcd);
} return ;
}

END.

简单数论 | Day3 部分题解的更多相关文章

  1. Pairs Forming LCM (LightOJ - 1236)【简单数论】【质因数分解】【算术基本定理】(未完成)

    Pairs Forming LCM (LightOJ - 1236)[简单数论][质因数分解][算术基本定理](未完成) 标签: 入门讲座题解 数论 题目描述 Find the result of t ...

  2. Help Hanzo (LightOJ - 1197) 【简单数论】【筛区间质数】

    Help Hanzo (LightOJ - 1197) [简单数论][筛区间质数] 标签: 入门讲座题解 数论 题目描述 Amakusa, the evil spiritual leader has ...

  3. Aladdin and the Flying Carpet (LightOJ - 1341)【简单数论】【算术基本定理】【分解质因数】

    Aladdin and the Flying Carpet (LightOJ - 1341)[简单数论][算术基本定理][分解质因数](未完成) 标签:入门讲座题解 数论 题目描述 It's said ...

  4. Sigma Function (LightOJ - 1336)【简单数论】【算术基本定理】【思维】

    Sigma Function (LightOJ - 1336)[简单数论][算术基本定理][思维] 标签: 入门讲座题解 数论 题目描述 Sigma function is an interestin ...

  5. Least Common Multiple (HDU - 1019) 【简单数论】【LCM】【欧几里得辗转相除法】

    Least Common Multiple (HDU - 1019) [简单数论][LCM][欧几里得辗转相除法] 标签: 入门讲座题解 数论 题目描述 The least common multip ...

  6. 七夕节 (HDU - 1215) 【简单数论】【找因数】

    七夕节 (HDU - 1215) [简单数论][找因数] 标签: 入门讲座题解 数论 题目描述 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们 ...

  7. Goldbach`s Conjecture(LightOJ - 1259)【简单数论】【筛法】

    Goldbach`s Conjecture(LightOJ - 1259)[简单数论][筛法] 标签: 入门讲座题解 数论 题目描述 Goldbach's conjecture is one of t ...

  8. (step7.2.1)hdu 1395(2^x mod n = 1——简单数论)

    题目大意:输入一个整数n,输出使2^x mod n = 1成立的最小值K 解题思路:简单数论 1)n可能不能为偶数.因为偶数可不可能模上偶数以后==1. 2)n肯定不可能为1 .因为任何数模上1 == ...

  9. 简单数论之整除&质因数分解&唯一分解定理

    [整除] 若a被b整除,即a是b的倍数,那么记作b|a("|"是整除符号),读作"b整除a"或"a能被b整除".b叫做a的约数(或因数),a ...

随机推荐

  1. NEERC 1999 Advertisement /// oj22646

    题目大意: 输入k,n :k为每位慢跑者最少应看到的广告牌数 接下来n行 描述第 i 位慢跑者的途径路段 输出需要设立的广告牌数 接下来每行为设立地点 Sample Input 5 101 1020 ...

  2. if else 和 swith效率比较

    读大话设计模式,开头的毛病代码用if else实现了计算器,说计算机做了三次无用功,优化后是用switch,那么switch为什么比if else效率高呢, 百度找了几个说是底层算法不一样,找了一个比 ...

  3. 0921CSP-S模拟测试赛后总结

    倒数第一祭. 感觉T3数据范围50可以qj一下.于是押了T3. 然后两个小时调我4.1k的bfs.最后调出来了发现策略错了.十分绝望. T120分吊住了.十分难过.倒数第一了.还是实力不行. 不应该押 ...

  4. 概率dp的迭代方式小结——zoj3329,hdu4089,hdu4035

    在推导期望方程时我们常常会遇到dp[i]和其他项有关联,那么这时候我们就难以按某个顺序进行递推 即难以通过已经确定的项来求出新的项 即未知数的相互关系是循环的 但是我们又可以确定和dp[i]相关联的项 ...

  5. vue知识点汇总

    一.学习vue必须了解的几个知识点  1.node.js介绍 node是一个让JavaScript运行在服务端的开发平台,使用JavaScript也可以开发后台服务.说明白些它仅仅是一个平台,我们使用 ...

  6. BZOJ 1911 (APIO 2010) 特别行动队

    题目描述 你有一支由n名预备役士兵组成的部队,士兵从1到n编号,要将他们拆分成若干特别行动队调入战场.出于默契考虑,同一支特别行动队中队员的编号应该连续,即为形如(i,i+1,-,i+k)的序列. 编 ...

  7. 基于Maven的ssm(spring+springMvc+Mybatis)框架搭建

    前言 本demo是在idea下搭建的maven项目,数据库使用Mysql,jdk版本是1.8.0_171,ideal:2017.3.5 一.新建项目 1.file->new->porjec ...

  8. HttpClient 使用案例

    package com.qifeng.config.ygx.common.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fas ...

  9. vuecli脚手架+vue+vuex实现vue驱动的demo。

    哎呀呀呀,现在大家都要会Vue ||  React,否则感觉跟这个前端的世界脱节了一样. start: vue-cli这个构建工具大大降低了webpack的使用难度,支持热更新,有webpack-de ...

  10. Http学习(三)

    HTTP的问题: 通信使用明文,可能会遭到窃听:HTTP本身不具备加密功能,根据TCP/IP协议工作的线路上可能会遭到窃听,即使通信内容已经加密,也会被看到 通信加密:通过SSL(Secure Soc ...