min25

该博客主要探讨了如何利用数学和编程技巧高效地计算大整数的乘法。作者详细解释了一个名为`S(int x, int y)`的函数,该函数用于计算大整数的乘法,并给出了相关的算法实现。博客中还涉及到了平方根、质数分解、快速幂等概念,以及一系列预处理步骤如初始化数组和计算辅助值。整个算法的目的是提高大整数乘法的计算速度,适用于大规模数值计算或密码学等领域。
摘要由CSDN通过智能技术生成
// Problem: #6053. 简单的函数
// Contest: LibreOJ
// URL: https://loj.ac/p/6053
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//#pragma GCC target("avx")
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize("Ofast")
// created by myq 
//#pragma GCC target("avx")
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize("Ofast")
// created by myq
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
#define x first
#define y second
typedef pair<int,int> pii;
const int N = 200010;
const int mod=1e9+7;
inline int read()
{
	int res=0;
	int f=1;
	char c=getchar();
	while(c>'9' ||c<'0')
	{
		if(c=='-')	f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		res=(res<<3)+(res<<1)+c-'0';
	}
	return res;
 }
#define int long long
int qmi(int a,int b)
{
	int res=1;
	while(b)
	{
		if(b&1)	res=res*a%mod;
		b>>=1;
		a=a*a%mod;	
	}
	return res;
}
int inv2=qmi(2,mod-2);
int n; 
bool st[N];
int g1[N];
int g2[N];
int cnt;
int prime[N];
int sum1[N];
int a[N]; 
int sum2[N];
int id1[N];
int T;
int m;
int id2[N];
inline int  id(int x)	
{
	return 	x<=T?id1[x]:id2[n/x];
}
int S(int x,int y)
{
//	cout<<x<<" "<<y<<endl;
	if(x<=1 || prime[y]>x )	return 0;
	int nowid=id(x);
	int res=((g1[nowid]-sum1[y-1]+sum2[y-1]-g2[nowid])%mod+mod)%mod;
	if(y==1)	res=(res+2)%mod;
	for(int i=y;i<=cnt&&prime[i]*prime[i]<=x;++i)
	{
		int t1=prime[i];
		int t2=prime[i]*prime[i];
//		if(prime[i]*prime[i]>x)
		
		for(int j=1;t2<=x;++j,t1=t2,t2*=prime[i])
		{
			res=(res+(prime[i]^j)*S(x/t1,i+1)%mod+(prime[i]^(j+1)))%mod;
		}
	}
	
		return res;
}
void init()
{
	 T=sqrt(n+0.5);
//	 prime[0]=1;
	for(int i=2;i<=T;i++)
	{
		if(!st[i])
		{
			prime[++cnt]=i;
			sum1[cnt]=sum1[cnt-1]+i;
			sum2[cnt]=sum2[cnt-1]+1;
		}
		for(int j=1;j<=cnt&&i*prime[j]<=T;j++)
		{
			st[i*prime[j]]=true;
			if(i%prime[j]==0)	break;
		}
	}

	for(int l=1;l<=n;l=n/(n/l)+1)
	{
		a[++m]=n/l;
		if(a[m]<=T)	id1[a[m]]=m;	
		else		id2[n/a[m]]=m;
		g1[m]=((a[m]%mod*(a[m]%mod+1)%mod*inv2%mod-1)%mod+mod)%mod;
		g2[m]=((a[m]-1)%mod+mod)%mod;
	}
	for(int j=1;j<=cnt;++j)
	{
		for(int i=1;i<=m && prime[j]*prime[j]<=a[i];++i)
		{
			g1[i]=((g1[i]-prime[j]*(g1[id(a[i]/prime[j])]-sum1[j-1]))%mod+mod)%mod;
			g2[i]=((g2[i]-1*(g2[id(a[i]/prime[j])]-sum2[j-1]))%mod+mod)%mod;
		}
	}
//	cout<<cnt<<endl;
}
signed main()
{
	cin>>n;
	init();
//	cout<<n<<endl;
	cout<<(S(n,1)+1)%mod<<endl;
	return 0;

}
/**
* In every life we have some trouble
* When you worry you make it double
* Don't worry,be happy.
**/




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段Stata代码的主要功能是进行数据处理和分析。下面是对每个命令的解释: 1. `cap pr drop A`:如果数据集中存在变量A,则删除该变量。 2. `pr def A`:定义一个缺失值标签A。 3. `cd "D:\Download"`:设置当前工作目录为 "D:\Download"。 4. `qui{}`:创建一个匿名的do文件块,使其中的命令不会显示在输出中。 5. `foreach var of varlist * {}`:对数据集中的每个变量执行循环。 6. `label variable `var' "`=`var'[1]'""`:为每个变量添加标签,标签值为该变量的第一个观测值。 7. `replace `var' = "" if _n == 1`:将每个变量的第一个观测值替换为空字符串。 8. `destring `var', replace`:将每个变量转换为数值型。 9. `drop in 1/2`:删除数据集中的第一行和第二行。 10. `cap rename Reptd Acc`:如果数据集中存在变量Reptd,则将其重命名为Acc。 11. `cap rename Fendd Acc`:如果数据集中存在变量Fendd,则将其重命名为Acc。 12. `cap g year = substr(Acc,1,4)`:创建一个新变量year,其值为Acc变量的前4个字符。 13. `cap drop Acc`:删除变量Acc。 14. `cap order Stkcd year`:按照Stkcd和year变量的顺序重新排序数据集。 15. `cap destring Stkcd year, force replace`:将Stkcd和year变量转换为数值型。 16. `compress`:压缩数据集,减少占用空间。 17. `end`:结束匿名的do文件块。 18. `import excel "D:\Download\高管个人资料文件174224075\CG_Director.xlsx", sheet("sheet1") firstrow`:从Excel文件导入数据集,文件路径为 "D:\Download\高管个人资料文件174224075\CG_Director.xlsx",工作表名为"sheet1",从第一行开始导入。 19. `A`:显示数据集的摘要信息。 20. `drop D`:删除变量D。 21. `duplicates drop`:删除数据集中的重复观测。 22. `destring *, force replace`:将所有变量转换为数值型。 23. `save 年末股价`:将当前数据集保存为 "年末股价"。 24. `import excel "D:\Download\分析师预测指标文件174652248\AF_Forecast.xlsx", sheet("sheet1") firstrow clear`:从Excel文件导入数据集,文件路径为 "D:\Download\分析师预测指标文件174652248\AF_Forecast.xlsx",工作表名为"sheet1",从第一行开始导入,并清除当前数据集。 25. `A`:显示数据集的摘要信息。 26. `save 表1`:将当前数据集保存为 "表1"。 27. `import excel "D:\Download\分析师预测指标文件174813143\AF_Forecast.xlsx", sheet("sheet1") firstrow clear`:从Excel文件导入数据集,文件路径为 "D:\Download\分析师预测指标文件174813143\AF_Forecast.xlsx",工作表名为"sheet1",从第一行开始导入,并清除当前数据集。 28. `A`:显示数据集的摘要信息。 29. `save 表2`:将当前数据集保存为 "表2"。 30. `import excel "D:\Download\分析师预测指标文件174931255\AF_Forecast.xlsx", sheet("sheet1") firstrow clear`:从Excel文件导入数据集,文件路径为 "D:\Download\分析师预测指标文件174931255\AF_Forecast.xlsx",工作表名为"sheet1",从第一行开始导入,并清除当前数据集。 31. `A`:显示数据集的摘要信息。 32. `save 表3`:将当前数据集保存为 "表3"。 33. `use 表1, clear`:使用数据集 "表1",并清除当前数据集。 34. `append using 表2 表3`:将数据集 "表2" 和 "表3" 追加到当前数据集。 35. `keep Stkcd y Feps`:保留变量Stkcd、y和Feps。 36. `destring F, force replace`:将变量F转换为数值型。 37. `bys S y: egen EPS = mean(F)`:按照变量S和y进行分组,计算变量F的均值,并创建新变量EPS。 38. `keep S y E`:保留变量S、y和E。 39. `order S y`:按照变量S和y的顺序重新排序数据集。 40. `duplicates drop`:删除数据集中的重复观测。 41. `xtset S y`:将数据集设置为面板数据,以变量S和y作为面板标识符。 42. `merge 1:1 S y using 年末股价, nogen keep(1 3)`:根据变量S和y进行一对一的合并,合并的数据集为"年末股价",不生成新变量,保留原有变量中的第1和第3个。 43. `g 权益资本成本 = sqrt((F2.EPS-F.EPS)/EndPrice)`:计算新变量"权益资本成本",其值为((F2.EPS-F.EPS)/EndPrice)的平方根。 44. `su 权`:对变量"权"进行描述性统计分析。 45. `tabstat 权 if y <= 2021, by(y) s(N mean sd min p25 p50 p75 max) c(s)`:对变量"权"在y<=2021的情况下,按照变量y进行分组,并计算每组的统计量(N、均值、标准差、最小值、25th百分位数、中位数、75th百分位数、最大值),并显示汇总统计结果。 46. `kdensity 权`:对变量"权"进行核密度估计,并绘制核密度图。 47. `save 权益资本成本`:将当前数据集保存为 "权益资本成本"。 希望这些解释对你有帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值