zoukankan      html  css  js  c++  java
  • [洛谷3935]Calculating

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

    首先显然有(sumlimits_{i=l}^rf(i)=sumlimits_{i=1}^rf(i)-sumlimits_{i=1}^{l-1}f(i)),于是问题转化为了如何求(sumlimits_{i=1}^nf(i)),即(sumlimits_{i=1}^nsumlimits_{d|i}1),调整枚举顺序有(sumlimits_{d=1}^nsumlimits_{i=1}^{lfloorfrac{n}{d} floor}1),即(sumlimits_{d=1}^nlfloordfrac{n}{d} floor),由于(n)很大,所以我们使用整除分块即可

    /*program from Wolfycz*/
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define inf 0x7f7f7f7f
    using namespace std;
    typedef long long ll;
    typedef unsigned int ui;
    typedef unsigned long long ull;
    inline char gc(){
    	static char buf[1000000],*p1=buf,*p2=buf;
    	return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
    }
    inline int frd(){
    	int x=0,f=1; char ch=gc();
    	for (;ch<'0'||ch>'9';ch=gc())	if (ch=='-')	f=-1;
    	for (;ch>='0'&&ch<='9';ch=gc())	x=(x<<3)+(x<<1)+ch-'0';
    	return x*f;
    }
    inline int read(){
    	int x=0,f=1; char ch=getchar();
    	for (;ch<'0'||ch>'9';ch=getchar())	if (ch=='-')	f=-1;
    	for (;ch>='0'&&ch<='9';ch=getchar())	x=(x<<3)+(x<<1)+ch-'0';
    	return x*f;
    }
    inline void print(int x){
    	if (x<0)	putchar('-'),x=-x;
    	if (x>9)	print(x/10);
    	putchar(x%10+'0');
    }
    const int p=998244353;
    int solve(ll n){
    	int res=0;
    	for (ll i=1,pos;i<=n;i=pos+1){
    		pos=n/(n/i); int len=(pos-i+1)%p;
    		res=(res+1ll*len*(n/i)%p)%p;
    	}
    	return res;
    }
    int main(){
    	ll l,r;
    	scanf("%lld%lld",&l,&r);
    	printf("%d
    ",(solve(r)-solve(l-1)+p)%p);
    	return 0;
    }
    
  • 相关阅读:
    叉积
    Linux IO模型
    uva10201-dp
    如何在Java内使用Protobuf
    uva10651-记忆化搜索
    ZK的几个常用方式
    uva10304-最优二叉搜索树
    uva590-DP-Always on the run
    Git神操作
    在容器内运行JVM时内存的问题
  • 原文地址:https://www.cnblogs.com/Wolfycz/p/10573866.html
Copyright © 2011-2022 走看看