SP34096 DIVCNTK - Counting Divisors (general)(min25)

题目链接:点击这里

题目大意:
在这里插入图片描述
题目分析:
好久以前的代码,发现一直 waiting \text{waiting} waiting rejudge \text{rejudge} rejudge 了一下,然后 ac \text{ac} ac 了,特此记录一下

具体细节见代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
#define int  unsigned ll
#define endl '\n'
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
using namespace std;
int read()
{
	int res = 0,flag = 1;
	char ch = getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch == '-') flag = -1;
		ch = getchar();
	}
	while(ch>='0' && ch<='9')
	{
		res = (res<<3)+(res<<1)+(ch^48);//res*10+ch-'0';
		ch = getchar();
	}
	return res*flag;
}
const int maxn = 1e6+5;
//const int mod = 1e9+7;
const double pi = acos(-1);
const double eps = 1e-8;
int n,m ,cnt,pri[maxn],sp1[maxn],sp2[maxn],sq;
int w[maxn],tot,id1[maxn],id2[maxn],g[maxn];
bool vis[maxn];
void get_pri(int n)
{
	for(int i = 2;i <= n;i++)
	{
		if(!vis[i])
		{
			pri[++cnt] = i;
			sp1[cnt] = (sp1[cnt-1]+i);
			sp2[cnt] = (sp2[cnt-1]+i*i);
		}
		for(int j = 1;j <= cnt && i*pri[j] <= n;j++)
		{
			vis[i*pri[j]] = true;
			if(i%pri[j] == 0) break;
		}
	}
}
int qpow(int a,int b)
{
	int res = 1;
	while(b)
	{
		if(b&1) res = res*a;
		a = a*a;
		b >>= 1;
	}
	return res;
}
ll S(int i,int j)
{
	if(pri[j] >= i) return 0;
	ll pos = i<=sq ? id1[i] : id2[n/i];
	ll res = g[pos]-j*(m+1); //质数部分贡献 
	for(int k = j+1;k<=cnt && pri[k]*pri[k]<=i;k++) //合数部分贡献 
	{
		ll pe = pri[k];
		for(int e = 1;pe <= i;e++,pe = pe*pri[k]) //不能取模 
		{
			ll x = pe;
			res = (res+(m*e+1)*(S(i/pe,k)+(e>1)));
		} 
	}
	return res;
}
signed main()
{
	get_pri(1e6);
	int t = read();
	while(t--)
	{
		tot = 0;
		n = read(); m = read(); sq = sqrt(n);
		for(int l = 1,r;l <= n;l = r+1)
		{
			r = min(n,n/(n/l));
			w[++tot] = n/l; //取余方便计算下述的g(n,0) 
			g[tot] = w[tot]-1;
			if(w[tot] <= sq) id1[w[tot]] = tot;
			else id2[n/w[tot]] = tot;
		}
		for(int j = 1;j <= cnt;j++) //g(n,j)
			for(int i = 1;i<=tot && pri[j]*pri[j]<=w[i];i++)
			{
				ll tmp = w[i]/pri[j];
				ll pos = tmp <= sq ? id1[tmp] : id2[n/tmp];
				g[i] = g[i]-g[pos]+j-1;
			}
		for(int i = 1;i <= tot;i++) g[i] *= (m+1);
		printf("%llu\n",(S(n,0)+1));
	}
	return 0;
}
您好!对于复现VQA-Counting模型,您可以按照以下步骤进行操作: 1. 数据集准备:首先,您需要准备VQA-Counting数据集。该数据集通常包含图像、问题以及答案。您可以在VQA官方网站或者其他开源数据集库中找到该数据集。确保将数据集分成训练集、验证集和测试集。 2. 模型选择:选择适合的模型来解决VQA-Counting任务。常见的模型包括基于深度学习的视觉问答模型,如VGGNet、ResNet等。您可以选择现有的基于视觉问答的模型,并根据需要进行修改。 3. 模型训练:使用训练集中的图像、问题和答案,对所选模型进行训练。在训练过程中,您可以使用图像特征提取器来提取图像特征,并将其与问题特征进行融合。然后,根据融合后的特征预测答案中存在的对象数量。 4. 模型评估:使用验证集对训练好的模型进行评估。通过计算预测答案与真实答案之间的误差或准确性指标来评估模型的性能。您可以使用常见的评估指标,如准确率、均方根误差等。 5. 模型调优:根据评估结果,您可以调整模型的超参数或结构,以进一步提高模型的性能。可以尝试不同的优化算法、学习率、批次大小等参数来优化模型。 6. 模型测试:在测试集上进行模型测试,并计算模型的最终性能指标。确保在测试集上的性能与验证集上的性能相当,以验证模型的泛化能力。 请注意,以上提到的步骤仅为一般建议,具体实现会因您选择的模型和数据集而有所不同。此外,复现VQA-Counting模型可能需要较大的计算资源和时间,因此您需要进行必要的准备。 希望这些步骤对您有所帮助!如果您有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值