题解 P4994 【终于结束的起点】

这道题,发现暴力能过时,喷了3k的血。。。本人花了近半小时打表找规律。。。然后真找出来一些了。。。

1.f[x^n]=f[x]*(x^(n-1))

2.设x,y为不相同的质数,则f[x^a*y^b]=lcm(f[x^a],f[y^b])。

3.对于一个质数x,他的f[x]极小(似乎都很小??)

对于一个n,我们就可以将他进行质因数分解:设n=x^ay^b...

然后我们暴力求出f[x],f[y],套上规律一,求出f[x^a],f[y^b],再套规律二,就可以求出来了。。。

分析:因为n<=706150,所以我们最多只需要暴力7个素数,而经试验,每个素数的f最多只有自身的2倍多(除了5是4倍。。。) 所以暴力运行次数最多为14*n(稳过。。。)

对于求f[x^a]套个log的快速幂,lcm也是log...所以,所有数据都是稳过的。。。

奉上代码:

#include<bits/stdc++.h>
using namespace std;
const int N=10000000;
int M;
bool is_not_prime[N];
int f[N],zhi[N],e;
inline void sai(int maxe){
    for(int i=2;i<=maxe;++i){
        if(!is_not_prime[i]){
            zhi[++e]=i;
            for(int j=i;j<=maxe/i;++j){
                is_not_prime[i*j]=1;
            }
        }
    }
}
inline int gcd(int x,int y){
    return x%y==0?y:gcd(y,x%y);
}
inline int lcm(int x,int y){//lcm
    return x/gcd(x,y)*y;
}
inline int bl(int x){//暴力计算
    f[1]=1;
    for(int i=2;i;++i){
        f[i]=f[i-1]+f[i-2];
        f[i]%=x;
        if(f[i]==1&&f[i-1]==0){
            return i-1;
        }
    }
}
inline int ksm(int x,int y){
    int ans=1;
    while(y){
        if(y&1){
            ans*=x;
        }
        x*=x;
        y>>=1;
    }
    return ans;
}
inline int div(int x){
    int ans=1;
    for(int i=1;i<=e;++i){
        if(zhi[i]>x){
            break;
        }
        if(x%zhi[i]==0){//分解质因数
            int tim=0;
            while(x%zhi[i]==0){//求幂
                tim++;
                x/=zhi[i];
            }
            int ti=bl(zhi[i]);
            ti*=ksm(zhi[i],tim-1);
            ans=lcm(ans,ti);
        }
    }
    return ans;
}
int main(){
    //2^n=3*2^(n-1)
    //3^n=8*3^(n-1)
    //5^n=20*5^(n-1)
    sai(706150);//筛法筛质数
    int x;
    scanf("%d",&x);
    printf("%d\n",div(x));
    return 0;
}

原文地址:https://www.cnblogs.com/ThinkofBlank/p/10146179.html

时间: 2024-10-12 10:03:29

题解 P4994 【终于结束的起点】的相关文章

终于结束的起点

额,本以为暴力过不去,qwq..竟然过去了... // luogu-judger-enable-o2 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; int n,k,a,b,i; int main() { cin>>n; a=0; b=1; for(i=1;;i++) { int c=a+b; a=

封闭开发终于结束了,回归我的博客,回归各个社区,回归“业余生活”....

从上个月一开始,一直在封闭开发,最近终于结束了.没办法,项目要求紧,人手又少,只能这样了.感觉挺累的,主要是精神累,有时候为了"速度",一些细节的处理,代码各个方法的处理有悖于面向对象的编程原则和开发模式,耦合性很强,没办法,敏捷开发,天天给你算着时间呢,不看你代码质量只看实现未实现,唉,后期再处理吧(我点于心不安). 还算好,天天加班到大晚上的日子结束了,又可以有自己的时间去学习自己的东西,去武装自己,提升自己的价值了,更重要的,感觉这样的生活才充实,感觉这样的生活才有进步和追求的动

2017 年的 人生 hard 模式终于结束了,2018年回归初心

2017 年的 人生 hard 模式终于结束了,2018年回归初心 2017年对于我个人来讲, 毫不夸张的说 算是近十年来除了高考那一年,最最惊心动魄的一年了,没有之一. >>>开篇 : 2017年年底的时候,朋友圈中 18岁的晒照片风,想想自己也已经毕业三年有余,这三年多的 职业发展,人生过渡,人情来往等等.在2017年这一年中也都算是有了一个全新的体验和心得,笔者会在后面的文章中描写清楚. 话说这一年中经历了,跳槽.跳槽失败.猎头.再次面试.试用期.买房.贷款... 由于这些事情的出

数论终于结束了——2.15

看了好几天b站视频了,终于看懂了,基本上都看懂了,那些可恶的数学证明过程也懂了一半左右. 明天再把寒假集训前那一点看看,就实战做题了 貌似,很快就要会北京了-- 原文地址:https://www.cnblogs.com/ACMerlxh/p/10384736.html

洛咕11月月赛部分题解 By cellur925

听说是你谷史上最水月赛?我不听我最菜 T1:终于结束的起点 月天歌名好评 给你一个模数 \(M\),请你求出最小的 \(n > 0\),使得\(fib(n)\) \(mod\) \(m=0\),\(fib(n+1)\) \(mod\) \(m=1\). 数学题,开始还想打表验证下,但是我不会告诉你我打表的时候没有很及时地取膜,然后中间有结果溢出,耽误了很长时间,企图找了很久规律.结果发现暴力就能过.hhh. 这个故事告诉我们要及时取膜! #include<cstdio> #include

第六届蓝桥杯本科B组C++省赛题解

比赛结束已经一星期了,成绩也出来了,江苏非211组的省前十,但是深感自己还是有太多的不足.绝对不能以自己还只是大一为借口,acm这条路还长的很. 目测得了95分(满分150),第一题错了,代码填空第一题错了,倒数第二题扣了一点分,最后一道大题全错. 之所以会这么晚来发这道题解,是因为深感自己不足,倒数第二题之所以没有做出来,是因为自己居然不会用[矩阵快速幂].因此,现学现用以自省. 关于题目:所有填空题都可以纯暴力,只要会回溯剪枝法对于蓝桥杯已经足够了.大题目难度一年比一年高 第一题 结果填空

答辩结束了

一直想做一个交易所撮合交易系统,苦于没有时间和机会.终于到了大学最后一学期的毕业设计,我果断选了朱斐一个水题,然后申请换题改成了自己想做的撮合引擎. 毕业设计的题目就叫<通用金融证券撮合交易引擎的设计与实现>,总共历时3个多月,写了一万多行代码及论文相关文献.刚开题的时候我在织网下载了不少和撮合交易系统相关的论文,基本上系统地看了一遍,大体上了解了撮合交易系统的架构.3月的时候开始动工写代码,技术上由于对C++的打包编译不熟悉,且需要造轮子的地方又很多,所以选择了Java SE作为开发平台.首

Codeforces Round #263 (Div. 1) 题解

A:Appleman and Toastman 题意:两个人玩游戏 初始第一个人给第二个人一个数组 第二个人把数组中每个数相加的和加到他的总得分里面,然后把这个数组还给第一个人,第一个人进行操作:若数组中只剩下一个数,就把这个数组扔了,否则把这个数组拆成两个数组扔回给第二个人,求第二个人的最大得分. 题解:游戏结束即为数组中N个数全被拆成了单独的一个数,而且我们可以知道若一个数在第一个人操作第K次时候变成只有一个数的数组,那么这个数在第二个人那算了K+1次,于是不难想到贪心算法,即让越大的数算的

# Codeforces Round #529(Div.3)个人题解

Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Repeating Cipher 传送门 题意:第一个字母写一次,第二个字母写两次,依次递推,求原字符串是什么 题解:1.2.3.4,非常明显的d=1的等差数列,所以预处理一个等差数列直接取等差数列的每一项即可 代码: #include<bits/stdc++.h> using namespace s