陕西师范大学第七届程序设计竞赛网络同步赛 J 黑猫的小老弟【数论/法拉数列/欧拉函数】

链接:https://www.nowcoder.com/acm/contest/121/J
来源:牛客网

题目描述

大家知道,黑猫有很多的迷弟迷妹,当然也有相亲相爱的基友,这其中就有一些二五仔是黑猫的小老弟。小老弟是如何产生的呢?聪明的iko告诉黑猫,其实是有规律的(她怎么知道???)!

一开始,有两个原始二五仔,代号0/1和1/1,

从原始二五仔到第n代小老弟,每代相邻两个小老弟a/b和c/d,产生一个新的小老弟(a+c)/(b+d),成为下一代新成员。将每一代的小老弟代号约分(包括0/1,1/1),进行约分简化,则每一代的代号(包括0/1,1/1),不会出现两个相同的分数。若分子或者分母大于n,则去掉该代号,将剩下的分数,从小到大排序,得到小老弟名单数列F。

现在,黑猫为了让这些小老弟往后稍稍,请您编程计算第n代的名单数列F的个数。

输入描述:

先输入一个数t,然后t组数据,每行一个数字n(n<10000)

输出描述:

输出第n代名单有多少人。
输入例子:
2
1
4
输出例子:
2
7

-->

示例1

输入

2
1
4

输出

2
7

示例2

输入

3
8803
9017
8370

输出

23559251
24718873
21296477

【分析】:可以发现,这棵树从中间分开,就是法里数列!法里数列长度f[n]=f[n-1]+φ(n)

法里数列:

Farey数列Fn对于每个n( n>=2 ),如果0<a<b<=n 且 ab互质即a/b为不可约有理数,那么就在Fn集合中且以递增序列排序。
F2 ={1/2} 
F3 = {1/3, 1/2, 2/3} 
F4 = {1/4, 1/3, 1/2, 2/3, 3/4} 
F5 = {1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5}

欧拉函数:

在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。

#include<bits/stdc++.h>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<cstring>
#include<set>
#include<queue>
#include<algorithm>
#include<vector>
#include<map>
#include<cctype>
#include<stack>
#include<sstream>
#include<list>
#include<assert.h>
#include<bitset>
#include<numeric>
#define debug() puts("++++")
#define gcd(a,b) __gcd(a,b)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define fi first
#define se second
#define pb push_back
#define sqr(x) ((x)*(x))
#define ms(a,b) memset(a,b,sizeof(a))
#define sz size()
#define be begin()
#define pu push_up
#define pd push_down
#define cl clear()
#define lowbit(x) -x&x
#define all 1,n,1
#define rep(i,n,x) for(int i=(x); i<(n); i++)
#define in freopen("in.in","r",stdin)
#define out freopen("out.out","w",stdout)
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> P;
const int INF = 0x3f3f3f3f;
const LL LNF = 1e18;
const int maxn = 1e3 + 20;
const int maxm = 1e6 + 10;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int dx[] = {-1,1,0,0,1,1,-1,-1};
const int dy[] = {0,0,1,-1,1,-1,1,-1};
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int n,k,t;
int e[maxm];
int sum[maxm],res = 0;
void init()
{
    ms(e,0);
    e[1]=1;
    for(int i=2;i<=maxm;i++){
        if(!e[i])
        for(int j=i;j<=maxm;j+=i){
            if(!e[j])
                e[j]=j;
            e[j]=e[j]/i*(i-1);
        }
    }
}
int main()
{
    init();

    sum[1]=2;
    for(int i=2;i<=maxm;i++)
        sum[i]=sum[i-1]+e[i]; //可以发现,这棵树从中间分开,就是法里数列~法里数列长度f[n]=f[n-1]+φ(n)

    cin>>t;
    while(t--)
    {
        cin>>n;
        cout<<sum[n]<<endl;
    }
}

原文地址:https://www.cnblogs.com/Roni-i/p/9038066.html

时间: 2024-08-01 05:52:47

陕西师范大学第七届程序设计竞赛网络同步赛 J 黑猫的小老弟【数论/法拉数列/欧拉函数】的相关文章

西安电子科技大学第16届程序设计竞赛网络同步赛 G-小国的复仇

sb找规律. 分解因数. 1 #include<bits/stdc++.h> 2 #define LL long long 3 #define fi first 4 #define se second 5 #define mk make_pair 6 using namespace std; 7 8 const int N=1e6+7; 9 const int M=100+7; 10 const int inf=0x3f3f3f3f; 11 const LL INF=0x3f3f3f3f3f3

2017年西南民族大学程序设计竞赛-网络同步赛(代码)

20598954 nmphy D 答案正确 8 512 486 C++ 2017-12-30 14:30:35 20598712 nmphy E 答案正确 3 504 695 C++ 2017-12-30 14:25:59 20598181 nmphy E 答案正确 3 484 659 C++ 2017-12-30 14:15:16 20597638 nmphy E 答案正确 3 504 505 C++ 2017-12-30 14:05:08//比赛时候这里显示的是WA,而且显示准确率5% 20

2017年西南民族大学程序设计竞赛-网络同步赛

题目描述 现在有一个N*M的矩形星图.其中包括恒星和黑洞.恒星可以向上.下.左.右发射光束,且允许光束从其中穿过:黑洞会吸收所有经过的光束. 若一颗恒星向上.下.左.右发射光束,你能告诉我,该光束能否避免被黑洞吸收,进入星图之外的区域么? 输入描述: 单组输入.第一行三个正整数N,M,Q(1 <= N,M<= 1000,1 <= Q <= 1000000),分别表示矩阵的行列,以及询问的个数,询问之间相互独立.然后一个N*M的矩阵,由’*’和’#’构成,表示星图.’*’表示恒星,’

华中农业大学第四届程序设计大赛网络同步赛 J

Problem J: Arithmetic Sequence Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1766  Solved: 299[Submit][Status][Web Board] Description Giving a number sequence A with length n, you should choosing m numbers from A(ignore the order) which can form an

第十四届华中科技大学程序设计竞赛决赛同步赛

第十四届华中科技大学程序设计竞赛决赛同步赛 A Beauty of Trees 思维,带权并查集 题意: 长度为 n 的序列,没告诉你具体数是多少.只给出 m 个查询,表示区间 [l,r] 的异或和为 k .但是第 i 个查询如果和前面的查询有矛盾,那就是错误的.输出所有的错误查询. tags: 对于一个查询,我们知道 sum[r] ^ sum[l-1] = k . 建成图就是 r -> (l-1) ,但要快速地求出异或值,就要用带权并查集处理.如有 sum[r]^sum[l-1]=k,即 r

湖南省第七届程序设计竞赛 最优对称路径

http://acm.nyist.net/JudgeOnline/problem.php?pid=564 湖南省第七届大学生计算机程序设计竞赛 题目G 最优对称路径 给一个n行n列的网格,每个格子里有一个1到9的数字.你需要从左上角走到右下角,其中每一步只能往上.下.左.右四个方向之一走到相邻格子,不能斜着走,也不能走出网格,但可以重复经过一个格子.为了美观,你经过的路径还必须关于"左下-右上"这条对角线对称.下图是一个6x6网格上的对称路径. 你的任务是统计所有合法路径中,数字之和最

牛客网 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-低年级组)求最大值

题目描述 给出一个序列,你的任务是求序列中 (a[j]-a[i])/(j-i)[1<=i<j<=n]的最大值 输入描述: 本题包含多组输入,每组输入第一行一个数字n,表示序列的长度.然后接下来一行输入n个数,表示原先序列的样子.数据范围:3<=n<=200000-1000000000<=a[i]<=1000000000 输出描述: 每组数据输出一行一个浮点数,保留两位小数,表示所求的最大值. 示例1 输入 5 2 4 6 8 10 输出 2.00 备注: 输入只有

哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)A - 所有情况的和

题目描述 在acimo星球, tabris 是一名勇敢的屠龙勇士,在上绿岛屠龙前决定挑选N种装备武装自己,现在每种装备有两个,**但每种装备tabris必须选择拿一个**,**不能多也不能少**.每件装备有自己的属性值,能给tabris属性加成.对于不同种类的装备之间有叠加效果,如果选择多件装备,最终的属性加成为他们的乘积.若tabris初始属性值为0,最后属性加成的期望是多少. 输入描述: 有多组测试样例,输入到文件结束.每组测试数据的第一行包含一个正整数NN,表示装备的种类数.接下来N行,每

北京师范大学第十六届程序设计竞赛决赛-重现赛 ACFGI

A 塞特斯玛斯塔 题目描述 quailty是一名狂热的ACM音游选手,沉迷各种音乐游戏,比如Lunatic Rave 2,osu!之类的. 今天,quailty玩的是国内游戏厂商雷亚(并不是赞助商)出品的一款音乐游戏Cytus. 游戏中,玩家需要随着游戏界面中上下移动的扫描线来适时演奏对应音符. 当上下移动的黑色线(扫描线)与圆形的物体(音符)的圆心重合时点击音符. 普通音符(图中第一种)只需点击即可. 锁链音符(图中第二种)将带箭头的音符(滑块)按下后不要松开,并将滑块沿着斜线和圆点组成的路径