ABC G容斥做法求调
  • 板块学术版
  • 楼主_determination_
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/6 21:49
  • 上次更新2024/7/7 08:39:23
查看原帖
ABC G容斥做法求调
530468
_determination_楼主2024/7/6 21:49
#include<bits/stdc++.h>
#define int __int128
//#define endl '\n'
using namespace std;
const int mod=1e9+7,inf=0x3f3f3f3f3f3f3f3f;
const int Max=38,N=12;
int pm[20]={0,2,3,5,7,11,13,17,19,23,29,31,37};
int base[20],ans;
int n;
int fp(int x,int p)//x^p<=n
{
    int ans=1;
    for ( int i = 1 ; i <= p ; i++ )
    {
    	ans*=x;
    	if(ans>n)return 0;
	}
    return 1;
}
int getans(int x)
{
    int l=2,r=n;
    if(!fp(2,x))return 1;
    while(l<r)
    {
        int mid=(l+r+1)/2;
        if(fp(mid,x))l=mid;
        else r=mid-1;
    }
//    cout << "sqrt" << x << " " << n << "=" << l << endl; 
    return l;
}
int calc()
{
    int flag=-1,cnt=1;
    for ( int i = 1 ; i <= N ; i++ )
    {
        if(base[i])
        {
            flag*=-1;
            cnt*=pm[i];
        }
    }
    if(cnt==1)return 0;
//    for ( int i = 1 ; i <= N ; i++ )cout << base[i];
//    cout << endl;
//    cout << "ans=" << flag*(getans(cnt)-1) << endl;
    return flag*(getans(cnt)-1);
}
void dfs(int x)
{
//	cout << "dfs" << x << endl;
    if(x==N+1)return ans+=calc(),void();
    base[x]=0;
    dfs(x+1);
    base[x]=1;
    dfs(x+1);
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	long long read;
    cin >> read;
    n=read;
    dfs(1);
    read=ans+1;
    cout << read;
	return 0;
}

过不去样例2

2024/7/6 21:49
加载中...