• NOIP模拟17.10.12


    T1 临江仙 旧梦

    题目背景

    闻道故园花陌,今年紫嫣红。扬帆直渡水千重。东君何解意,送我一江风。

    还是昔时庭院,终得醉卧花丛。残更惊醒月明中。流光如旧岁,多少梦成空。

    题目描述

    #define goodcatdog gcd

    #define important i

    #define judge  j

    神说 每个梦想就是一轮月亮,高高地孤寂地挂在清冷的夜空。为了让月亮不再孤独,灯神给她找了好多好多伴儿现在天空上就有n轮月亮啦!

    月亮在天上跟相邻的伙伴玩够以后,就开始想要去找其他月亮玩,灯神为了让月亮变得更聪明,下了一个规定:若两个月亮编号分别为importantjudge,若important ,judge满足goodcatdog(important,judge)>β,则important,judge就可以联通。

    现在来了一个垃圾神叫J乌拉,他想知道编号为x的月亮和编号为y的月亮是否联通,聪明的你能帮帮它吗????

    输入描述

    第一行为一个数T,表明有T组测试数据

    四个个数n,β,x,y;

    输出描述

    x,y联通,输出YeS,否则输出No

    样例输入 

    1

    12 2 8 9

    样例输出

    YeS

    数据范围:

    对于30%的数据 n<=10

    对于50%的数据 n<=15

    对于第六个测试点 n<=65432

    对于第七,八个测试点 n<=999999

    对于100%的数据 β<=n<=1000000;T<=4;x,y<=n<=10000000

    【题解】

    从b开始到n暴力枚举gcd,然后把gcd的倍数连起来就好了

    如果是我就给m组询问来卡输出yes或no的骗分

    只给一组x.y让我一直往x,y分解上想浪费了不少时间

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <cstdlib>
     5 #include <cstring>
     6 #include <ctime>
     7 #define min(a, b) ((a) < (b) ? (a) : (b))
     8 #define max(a, b) ((a) > (b) ? (a) : (b))
     9 
    10 inline void swap(int &x, int &y)
    11 {
    12     long long tmp = x;x = y;y = tmp;
    13 }
    14 
    15 inline void read(int &x)
    16 {
    17     x = 0;char ch = getchar(), c = ch;
    18     while(ch < '0' || ch > '9')c = ch, ch = getchar();
    19     while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
    20     if(c == '-')x = -x;
    21 }
    22 
    23 const int INF = 0x3f3f3f3f;
    24 const int MAXN = 1000000 + 10;
    25 
    26 int prime1[MAXN], prime2[MAXN], cnt1[MAXN], cnt2[MAXN], tot1, tot2, n, f1, f2, b, x, y, t, tmp, fa[MAXN];
    27 
    28 int find(int x)
    29 {
    30     return x == fa[x] ? x : fa[x] = find(fa[x]);
    31 }
    32 
    33 int gcd(int a, int b)
    34 {
    35     return !b ? a : gcd(b, a % b);
    36 }
    37 
    38 int main()
    39 {
    40     read(t);
    41     for(;t;--t)
    42     {
    43         read(n), read(b), read(x), read(y);
    44         for(register int i = 1;i <= n;++ i)fa[i] = i;
    45         for(register int i = max(b + 1, 1);i <= n;++ i)
    46         {
    47             for(register int j = i;j <= n;j += i)
    48             {
    49                 f1 = find(j), f2 = find(i);
    50                 fa[f1] = f2;
    51             }
    52         }
    53         f1 = find(x), f2 = find(y);
    54         if(f1 == f2)printf("YeS
    ");
    55         else printf("No
    ");
    56     }
    57     fclose(stdin);
    58     fclose(stdout);
    59     return 0;
    60 }
    T1

    T2 长命女

    题目背景

    夏夜宴,绿酒一杯歌一遍

    再拜陈三愿:

    一愿郎君千岁;

    妻妾常健;

    三月如同梁上雕燕,

    你我常相见

    题目描述

    给定一个r*c的矩阵,在这个矩阵中有...一棵树!这棵树上有n间小屋,每间小屋都有v[i]个松果,两个小屋之间有一条双向树枝相连。

    小浪是一只特别懒小松鼠,他希望知道从每间小屋向外扩展γ步范围内最多能拿到多少松果,不聪明的你可以帮帮他吗????

    输入描述

    第一行 r,c

    第二行 n,γ

    以下n-1 x,y有连边

    最后一行n个数 表示每个小屋的松果数目。

    输出描述

    n行,每行为第i个小屋最多能拿到多少松果

    样例输入

    8 8

    6 2

    5 1

    3 6

    2 4

    2 1

    3 2

    1

    2

    3

    4

    5

    6

    样例输出

    15

    21

    16

    10

    8

    11

    数据范围

    对于10%的数据:n<=10,r<=c<=50

    对于40%的数据:n<=1000

    对于100%的数据:n<=100000;0<=v[i]<=1000;γ<=20;r<=1000000,c<=1000000

    【题解】

    这个题比较显然

    dp[i][j]表示从i向i的子树走j步的价值

    我们考虑如何往上走

    从根节点往下DP即可

    注意转移顺序

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #define min(a, b) ((a) < (b) ? (a) : (b))
     6 #define max(a, b) ((a) > (b) ? (a) : (b))
     7 
     8 const long long MAXN = 100000 + 10;
     9 const long long MAXGA = 20 + 5;
    10 
    11 inline void swap(long long &x, long long &y)
    12 {
    13     long long tmp = x;x = y;y = tmp;
    14 }
    15 
    16 inline void read(long long &x)
    17 {
    18     x = 0;char ch = getchar(), c = ch;
    19     while(ch < '0' || ch > '9')c = ch, ch = getchar();
    20     while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
    21     if(c == '-')x = -x;
    22 }
    23 
    24 long long dp[MAXN][MAXGA], n, value[MAXN], deep[MAXN], len, head[MAXN], cnt, b[MAXN], bb[MAXN];
    25 
    26 struct Edge
    27 {
    28     long long u,v,next;
    29     Edge(long long _u, long long _v, long long _next){u = _u;v = _v;next = _next;}
    30     Edge(){}
    31 }edge[MAXN << 1];
    32 
    33 inline void insert(long long a, long long b)
    34 {
    35     edge[++cnt] = Edge(a,b,head[a]);
    36     head[a] = cnt;
    37 } 
    38 
    39 void dfs(long long u)
    40 {
    41     b[u] = 1;
    42     deep[u] = 0;
    43     for(register long long i = 0;i <= len;++ i)
    44         dp[u][i] = value[u];
    45     for(register long long pos = head[u];pos;pos = edge[pos].next)
    46     {
    47         long long v = edge[pos].v;
    48         if(b[v]) continue;
    49         dfs(v);
    50         deep[u] = max(deep[u], deep[v] + 1);
    51         for(register long long i = 1;i <= len;++ i)
    52             dp[u][i] += dp[v][i - 1];
    53     }
    54     return;
    55 }
    56 
    57 void dfs2(long long u)
    58 {
    59     bb[u] = 1;
    60     for(register long long pos = head[u];pos;pos = edge[pos].next)
    61     {
    62         long long v = edge[pos].v;
    63         if(bb[v])continue;
    64         for(register long long i = len;i >= 2;-- i)
    65             dp[v][i] += dp[u][i - 1] - dp[v][i - 2];
    66         dp[v][1] += dp[u][0];
    67         dfs2(v);
    68     }
    69 }
    70 
    71 int main()
    72 {
    73     freopen("young.in", "r", stdin);
    74     freopen("young.out", "w", stdout);
    75     read(n);read(len);
    76     read(n);read(len);
    77     for(register long long i = 1;i < n;++ i)
    78     {
    79         long long tmp1, tmp2;
    80         read(tmp1), read(tmp2);
    81         insert(tmp1, tmp2);
    82         insert(tmp2, tmp1);
    83     }
    84     for(register long long i = 1;i <= n;++ i)
    85         read(value[i]);
    86     dfs(1);
    87     dfs2(1);
    88     for(register long long i = 1;i <= n;++ i)
    89         printf("%lld
    ", dp[i][len]);
    90     fclose(stdin);
    91     fclose(stdout);
    92      return 0;
    93 }
    T2

    T3 春江花月夜(AK好题)

    题目背景

    春江潮水连海平,海上明月共潮生。滟滟随波千万里,何处春江无月明!

    江流宛转绕芳甸,月照花林皆似霰;空里流霜不觉飞,汀上白沙看不见。

    江天一色无纤尘,皎皎空中孤月轮。江畔何人初见月?江月何年初照人?

    人生代代无穷已,江月年年只相似。不知江月待何人,但见长江送流水。

    白云一片去悠悠,青枫浦上不胜愁。谁家今夜扁舟子?何处相思明月楼?

    可怜楼上月徘徊,应照离人妆镜台。玉户帘中卷不去,捣衣砧上拂还来。

    此时相望不相闻,愿逐月华流照君。鸿雁长飞光不度,鱼龙潜跃水成文。

    昨夜闲潭梦落花,可怜春半不还家。江水流春去欲尽,江潭落月复西斜。

    斜月沉沉藏海雾,碣石潇湘无限路。不知乘月几人归,落月摇情满江树。

    题目描述

    小春和小江是两个很好的朋友,他们都信奉灯神教。有一天,小春突发奇想,学习起了莫比乌斯反演,恰好在这天,小江也突发奇想,学起了快速傅里叶变换。可是莫比乌斯反演比快速傅里叶变换字数多啊,于是乎小春就比小江学得快。

    小春非常得意,利用所学知识给小江出了一倒防AK好题:已知在这个宇宙中有n个太阳和n个月亮,由于宇宙之神--灯神是一个喜爱数学的神,所以他就规定了n属于数域P。灯神把整个宇宙抽象成了一个二维平面坐标系,对于每个太阳和每个月亮,都有自己的一个坐标xi,yi 坐标也是数域成员。如果一个太阳想去找一个月亮玩,那么他只能往东面或者南面飞。月亮是不能动哒!飞行单位距离为1,他就会消耗的花费(其中p,q分别为斐波那契数列第100007 100000007项对1000000007取模的值) 灯神想知道怎么让每个太阳都能找到某个月亮玩使得花费最小(一个月亮只能被找一次)?小江一下子就被难倒了,询问聪明的你,那么聪明年轻帅气漂亮颜值居高无比的你能帮助他解决这个问题吗?(保证答案在long int的十分之一范围内)。

    题目提示

    1.数域定义 F是一个数环(S是复数集的非空子集,如果S中的数对任意两个数的和、差、积仍属于S,则称S是一个数环),如果对任意的a,b∈F而且a≠0, b/a∈F;则称F是一个数域。著名的域有:Klein四元域。

    数域性质 任何数域都包含有理数域Q。即Q是最小的数域。

    证明:F必有一个非零元素a.由于F为数环,所以0 = a - a属于F1 = a/a 属于F01都属于F那么2 = 1+13 = 2+1。。。。自然数N都属于F-n = 0 - n 也属于F故整数集合Z都属于F那么a/b 也属于F(其中a,b为整数)这样,任何一个数域都包含Q

    2.莫比乌斯反演

    卷积:d|n表示d能整除n,比如 2|4 (=.=)定义关于整数的函数F(n)然后定义G(n)=Σ(F(d)) (其中d|n)  

    反演原式:G(n)=Σ(F(d))(其中d|n)  

    反演公式:F(n)=Σ(U(n/d)*G(d))这里U是莫比乌斯函数,他是每一项 G(d) 的系数。

    3.欧拉函数:      

    其中p1, p2……pnx的所有质因数,x是不为0的整数。

    φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。

    输入描述

    第一行为一个正整数n,表示天月亮的数量(太阳的数量与之相等)。接下来n行,每行两个整数xi和yi,表示太阳的坐标。规定向东向北为x,轴正方向。接下来n行,每行两个数ab,示月亮的坐标。

    输出描述

    第一行包含一个数,表示最小的花费。答案对斐波那契数列的第100000007项取模。

    样例输入

    3

    3 5

    1 2

    4 3

    6 3

    5 2

    2 1

    样例输出

    9

    数据范围

    对于30%的数据 n<=300

    对于第四,五个测试点 n<=20000

    对于第六,七,八个测试点 n<=25000

    对于100%的数据 n<=3 0 0 0 1;0<=xi,yi<=1 0 0 0 0 0,0<=a,b<=1 0 0 0 0 0.

    保证答案存在。

    发奇想,学起了快速傅里叶变换。可是莫比乌斯反演比快速傅里叶变换字数多啊,于是乎小春就比小江学得快。

    小春非常得意,利用所学知识给小江出了一倒防AK好题:已知在这个宇宙中有n个太阳和n个月亮,由于宇宙之神--灯神是一个喜爱数学的神,所以他就规定了n属于数域P。灯神把整个宇宙抽象成了一个二维平面坐标系,对于每个太阳和每个月亮,都有自己的一个坐标xi,yi 坐标也是数域成员。如果一个太阳想去找一个月亮玩,那么他只能往东面或者南面飞。月亮是不能动哒!飞行单位距离为1,他就会消耗的花费(其中p,q分别为斐波那契数列第100007 100000007项对1000000007取模的值) 灯神想知道怎么让每个太阳都能找到某个月亮玩使得花费最小(一个月亮只能被找一次)?小江一下子就被难倒了,询问聪明的你,那么聪明年轻帅气漂亮颜值居高无比的你能帮助他解决这个问题吗?(保证答案在long int的十分之一范围内)。

    题目提示

    1.数域定义 F是一个数环(S是复数集的非空子集,如果S中的数对任意两个数的和、差、积仍属于S,则称S是一个数环),如果对任意的a,bF而且a0, b/aF;则称F是一个数域。著名的域有:Klein四元域。

    数域性质 任何数域都包含有理数域Q。即Q是最小的数域。

    证明:F必有一个非零元素a.由于F为数环,所以0 = a - a属于F1 = a/a 属于F01都属于F那么2 = 1+13 = 2+1。。。。自然数N都属于F-n = 0 - n 也属于F故整数集合Z都属于F那么a/b 也属于F(其中a,b为整数)这样,任何一个数域都包含Q

    2.莫比乌斯反演

    卷积:d|n表示d能整除n,比如 2|4 (=.=)定义关于整数的函数F(n)然后定义G(n)=Σ(F(d)) (其中d|n)  

    反演原式:G(n)=Σ(F(d))(其中d|n)  

    反演公式:F(n)=Σ(U(n/d)*G(d))这里U是莫比乌斯函数,他是每一项 G(d) 的系数。

    3.欧拉函数:      

    其中p1, p2……pnx的所有质因数,x是不为0的整数。

    φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。

     

     

    输入描述

    第一行为一个正整数n,表示天月亮的数量(太阳的数量与之相等)。接下来n行,每行两个整数xi和yi,表示太阳的坐标。规定向东向北为x,轴正方向。接下来n行,每行两个数ab,示月亮的坐标。

    输出描述

    第一行包含一个数,表示最小的花费。答案对斐波那契数列的第100000007项取模。

    样例输入

    3

    3 5

    1 2

    4 3

    6 3

    5 2

    2 1

    样例输出

    9

    数据范围

    对于30%的数据 n<=300

    对于第四,五个测试点 n<=20000

    对于第六,七,八个测试点 n<=25000

    对于100%的数据 n<=3 0 0 0 1;0<=xi,yi<=1 0 0 0 0 0,0<=a,b<=1 0 0 0 0 0.

    保证答案存在。

     

     

    【题解】

     

    尼玛

    被这个恶心的式子坑了

    一眼看上去  没法做

    莫比乌斯反演 不会做这个式子然后果断放弃

    尼玛经dalao说这个题就是个sb题

    一看式子!!

    !!!

    如果去掉下取整就是个sb题

    出题人的锅(唔)

    懒得写了

  • 相关阅读:
    2021.8.2—2021.8.8
    2021.7.29
    2021.7.27
    2021.7.26
    GC日志分析
    学习类加载机制笔记
    4、SpringCloud停更说明
    3、SpringCloudAlibaba版本选择
    京东、阿里的微服务架构
    nacos集群安装
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/7657529.html
Copyright © 2020-2023  润新知