jzoj5317 【清华集训2017模拟8.19】func (寻找性质)

31 篇文章 0 订阅

题意

这里写图片描述
n<=1e6

分析

做比赛的时候啥也没看出来..
f(x)=n 的所有x,我们先将函数的定义式分析一下。
f(2i)=f(i)
f(2i+1)=f(i)+f(i+1)
两个相邻的f也是由两个相邻的f推来的。那么我们不如枚举 f(x1)=i ,然后发现可以确定唯一的 x 。需要注意的是相邻f(x)互质 (归纳法).

这个过程类似欧几里得,我们设f(g(a,b))=a,f(g(a,b)+1)=b
分a < b与a > b两种情况讨论一下,显然哪边大哪边就是奇数。
然后考虑如何将“更相减损“变成“辗转相除“。
直接根据原有性质优化就行了,比较简单吧。

demo

1 更相减损

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=1e6+10,mo=998244353;
int n,ans[N],d[N][2];
int gcd(int x,int y) {return y?gcd(y,x%y):x;}
int g(int a,int b) { 
    if (a==1 && b==1) return 1;
    int xx=0;
    if (a<b) { 
        xx=g(a,b-a);
        return xx*2%mo;
    } else {
        xx=g(a-b,b);
        return (xx*2+1)%mo;
    }
}
int main() {
    freopen("func.in","r",stdin);
    freopen("func.out","w",stdout);
    cin>>n;
    for (int i=1; i<=n; i++) if (gcd(i,n)==1) {
        int x=g(i,n);
        ans[++ans[0]]=x+1;
    }
    sort(ans+1,ans+1+ans[0]);
    for (int i=1; i<=ans[0]; i++) printf("%d\n",ans[i]);
}

2 辗转相除

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+10,mo=998244353;
int n,ans[N];
int mi[N];
int xg[N],xc[N];

int gcd(int x,int y) {return y?gcd(y,x%y):x;}
int g(int a,int b) { 
    if (a==0 || b==0) return 1; 
    int xx=0;
    if (a<b) {
        int cnt=(b-1)/a+1;
        xx=g(a,b%a);
        return (ll) xx*mi[cnt-1]%mo;
    } else {
        int cnt=(a-1)/b+1;
        xx=g(a%b,b);
        return ((ll) xx*mi[cnt-1]%mo+mi[cnt-1]-1)%mo;
    }
}
int main() {
    freopen("func.in","r",stdin);
//  freopen("func.out","w",stdout);
    cin>>n;
    mi[0]=1; for (int i=1; i<=n; i++) mi[i]=(ll) mi[i-1] * 2%mo;
    for (int i=1; i<=n; i++) if (gcd(i,n)==1) {
        int x=g(i,n);
        ans[++ans[0]]=x+1;
    }
    sort(ans+1,ans+1+ans[0]);
    for (int i=1; i<=ans[0]; i++) printf("%d\n",ans[i]);
}
要在CentOS 7上安装MySQL 8.19,您可以按照以下步骤操作: 1. 首先,您需要下载MySQL 8.19的压缩包,并将其解压缩到/usr/local/目录下。您可以使用以下命令将解压得到的文件移动到/usr/local/目录,并重新命名为mysql: ``` mv mysql-8.0.19-linux-glibc2.12-x86_64 /usr/local/mysql ``` 引用 2. 接下来,您需要修改/usr/local/mysql/目录的权限,以确保MySQL能够正常运行。您可以使用以下命令更改目录的所有者和组为mysql: ``` chown -R mysql.mysql /usr/local/mysql/ ``` 引用 3. 之后,您可以将MySQL的启动脚本复制到/etc/init.d/目录中,以便MySQL可以作为服务启动和停止。您可以使用以下命令执行此操作: ``` cp ../support-files/mysql.server /etc/init.d/mysqld ``` 引用 完成上述步骤后,您就成功安装了MySQL 8.19。您可以使用适当的命令启动、停止和管理MySQL服务。请记住,这只是安装MySQL的基本步骤,您可能需要根据您的具体需求进行其他配置和设置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [centos7安装MySQL Community Server 8.0.19](https://blog.csdn.net/resuper0/article/details/104442933)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值