luogu4884 多少个1?

本文深入解析了BSGS算法在处理特定数学问题中的应用,特别是针对大数乘法的优化技巧。通过引入一种名为真正的快速乘的方法,解决了在模运算中直接使用BSGS算法可能导致的数据溢出问题。文章提供了详细的代码实现,展示了如何在不牺牲精度的前提下,大幅提升算法的运行效率。

题目链接:https://www.luogu.org/problemnew/show/P4884

套路的将\(111...1\)记做\(\frac{10^n-1}{9}\),去分母移项的\(10^n\equiv9k+1(mod\ m)\)

直接\(BSGS\)?中间乘会爆long long!

使用龟速乘?这个\(O(log)\)的时间可以让你完美的爆掉

来看一个真正的快速乘(from sxyugao)
\[ a*b=a*(L+R)=a*L+a*R \]
其中\(b=L+R\),我们让\(L\)\(b\)的前\(x\)位,\(R\)\(b\)的后\(x\)位即可

真正的\(O(1)\)快速乘

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<unordered_map>
using namespace std;
#define int long long
#define lowbit(x) (x)&(-x)
#define sqr(x) (x)*(x)
#define fir first
#define sec second
#define rep(i,a,b) for (register int i=a;i<=b;i++)
#define per(i,a,b) for (register int i=a;i>=b;i--)
#define maxd 1000000007
#define eps 1e-6
typedef long long ll;
const int N=100000;
const double pi=acos(-1.0);
ll k,m;
unordered_map<ll,int> mp;

int read()
{
    int x=0,f=1;char ch=getchar();
    while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
    while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
    return x*f;
}

ll mul(ll x,ll y,ll p)
{
    if ((x>1e9) || (y>1e9))
    {
        ll l=x*(y>>25ll)%p*(1ll<<25)%p,
           r=x*(y&((1ll<<25)-1))%p;
        return (l+r)%p;
    }
    else return x*y%p;
}
        

ll qpow(ll x,ll y,ll p)
{
    ll ans=1;
    while (y)
    {
        if (y&1) ans=mul(ans,x,p);
        x=mul(x,x,p);
        y>>=1;
    }
    return ans;
}

ll bsgs(ll a,ll b,ll p)
{
    a%=p;b%=p;
    if (!a) return (b==0);
    ll unit=sqrt(p)+1,tmp=b;
    rep(i,0,unit-1)
    {
        mp[tmp]=i;
        tmp=mul(tmp,a,p);
    }
    tmp=qpow(a,unit,p);ll sum=1;
    rep(i,1,unit)
    {
        sum=mul(sum,tmp,p);
        if (mp.count(sum)) return unit*i-mp[sum];
    }
    return -1;
}

signed main()
{
    k=read();m=read();
    printf("%lld",bsgs(10,k*9+1,m));
    return 0;
}

转载于:https://www.cnblogs.com/encodetalker/p/10847219.html

一款轻量而功能强大的点云可视化和编辑软件,支持pcd, ply, las等多种格式,轻松打开海量点云数据,支持多方式多字段渲染点云,对点进行方便的查询、量测和编辑,提供了地面滤波算法,可应用于测绘、高精地图、SLAM等领域。 PCDViewer是一款专业的点云数据处理软件,特别适用于处理和编辑大规模点云数据。该软件支持多种点云文件格式,包括pcd、ply和las等,这些格式广泛应用于激光雷达扫描数据、三维建模以及其他测绘技术。PCDViewer的强大之处在于其轻量级的系统要求与丰富的功能集,使得用户可以在Windows、Ubuntu等操作系统上轻松运行软件,高效地处理海量点云数据。 这款软件的一个主要特点是其多方式多字段渲染点云的能力。这允许用户根据不同的属性,如颜色、强度、高度等,对点云进行视觉上的分类和区分,从而更直观地分析和理解点云数据。此外,PCDViewer还提供了方便的查询、量测和编辑功能,允许用户直接对点云数据进行操作,诸如添加注释、删除噪声点或进行精确测量等,极大地提高了工作效率。 软件还内置了地面滤波算法,这一功能对于测绘学、地理信息系统(GIS)以及机器人导航和定位(SLAM)等领域尤为关键。地面滤波算法能够从点云数据中分离出地面点和非地面点,这对于如道路建模、地形分析、植被测量等应用来说至关重要。通过分离地面点,可以更准确地进行地面建模和地形特征分析,为自动化系统提供清晰的环境地图。
内容概要:本文提出了一种计及并网波动约束和储能荷电状态(SOC)的混合储能功率协调控制方法,并提供了完整的Matlab代码实现。该方法针对可再生能源并网系统中存在的功率波动问题,采用锂电池与超级电容构成的混合储能系统进行功率平抑,通过低通滤波与动态时间常数调节实现高频/低频功率分量的合理分配,同时引入SOC反馈控制机制,实时调节功率分配系数,确保各储能单元的荷电状态维持在安全范围内,避免过充过放,从而在满足并网功率波动标准的同时,延长储能系统使用寿命。文中详细阐述了控制策略的设计原理、关键参数整定方法及仿真验证过程,展示了该方法在平抑功率波动和均衡储能SOC方面的优越性能。; 适合人群:具备电力系统、新能源并网或储能控制基础知识的研究生、科研人员及从事相关领域工程开发的技术人员。; 使用场景及目标:①研究混合储能系统在平抑风电/光伏并网功率波动中的应用;②掌握基于SOC反馈的储能功率协调控制策略设计方法;③学习Matlab/Simulink在电力电子与电力系统仿真中的建模与分析技巧;④为撰写学术论文或完成科研项目提供可复现的技术方案与代码参考。; 阅读建议:建议结合Matlab代码逐行理解控制逻辑,重点关注低通滤波与SOC反馈环节的实现方式,并尝试调整参数观察系统响应变化,以深入掌握控制策略的动态特性与优化思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值