19南京icpc(JG)

Posted 钟钟终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了19南京icpc(JG)相关的知识,希望对你有一定的参考价值。

CSDN话题挑战赛第2期

Problem J. Prime Game

思路:
1.计算(1,1)(1,2)(1,3)(1,4)……(1,10)和(2,2)(2,3)(2,4)……(2,10)……每个区间不同的质因子个数。刚开始想使用前缀和的思路,但此时数组最大可开到1e9,这个方法就不行了。
2.因此若看到每个质因子对于它来说有贡献的区间总数,就好思考了很多。
若这个质因子,之前没出现过,则有贡献的区间数为(n-pos+1)*(pos)
若这个质因子,之前出现过,则贡献区间数为(pos-p+1)*(n-pos+1),p为该因子上次出现的下标+1

#include<bits/stdc++.h>
//#define int long long
#define ll long long
#define endl '\\n'
#define For(i,a,b) for(i=(a);i<=(b);++i)
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
const int N=1e6+5;
const int inf=1e18;
const int mod=998244353;
int n,a[N];
ll ans;
vector<int>e[N];
void fj(int x,int pos)

    if(x==1) return;
    if(x==2)
    
        e[2].push_back(pos);return;
    
    if(x==3)
    
        e[3].push_back(pos);return;
    
    for(int i=2;i*i<=x;i++)
    
        if(x%i==0)
        
            e[i].push_back(pos);
            while(x%i==0) x/=i;
        
    
    if(x>1)
        e[x].push_back(pos);

ll add(int x,int pos)

    if(e[x].size())
    
        int p=e[x].back()+1;
        return (ll)(pos-p+1)*(n-pos+1);
    
    else
        return (ll)pos*(n-pos+1);


void solve()

    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
    
        int tmp=a[i];
        if(tmp==2||tmp==3)
        
            ans+=add(tmp,i);fj(a[i],i);continue;
        
        for(int j=2;j*j<=tmp;j++)
        
            if(tmp%j==0)
            
                ans+=add(j,i);
                while(tmp%j==0) tmp/=j;
            
        
        if(tmp>1)
            ans+=add(tmp,i);
        fj(a[i],i);
    
    cout<<ans<<endl;


signed main()

    ios;
    //int T;cin>>T;
    //while(T--)
        solve();
    return 0;


Problem G. Pyramid

打表:模拟坐标系,进行打表找三角形,排列如下:
1 5 15 35 70 126 210 330……
做差如下:
4,10,20,35,56,84,120(第一次)
6,10,15,21,28,36(第二次)
4,5,6,7,8(第三次)
1,1,1,1(第四次)
相当于函数求四次导为常数,可构造曲线y=ax4+bx3+cx2+dx+e
解方程得:a=1/24 , b=6/24, c=11/24, d=6/24, e=0

#include<bits/stdc++.h>
//#define int long long
#define ll long long
#define endl '\\n'
#define For(i,a,b) for(i=(a);i<=(b);++i)
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
const int N=1e6+5;
const int inf=1e18;
const int mod=998244353;
int n,cnt;
double sx,sy;
struct node

    double x,y;
e[N];
double cal(int i,int j)

    return (e[i].x-e[j].x)*(e[i].x-e[j].x)+(e[i].y-e[j].y)*(e[i].y-e[j].y);

int check(int i,int j,int k)

    double d1=cal(i,j);
    double d2=cal(i,k);
    double d3=cal(j,k);
    if(abs(d1-d2)<=0.0001&&abs(d1-d3)<=0.0001&&abs(d2-d3)<=0.0001)
        return 1;
    else
        return 0;

void solve()

    while(cin>>n)
    
        sx=sy=0;
        cnt=0;
        for(int i=n;i>=0;i--)
        
            for(int j=0;j<=i;j++)
            
                e[++cnt].x=sx+j*2;
                e[cnt].y=sy;
            
            sx+=1;sy+=sqrt(3);
        
        int ans=0;
        for(int i=1;i<=cnt;i++)
        for(int j=i+1;j<=cnt;j++)
        for(int k=j+1;k<=cnt;k++)
        if(check(i,j,k)==1) ans++;
        cout<<ans<<endl;
    


signed main()

    //ios;
    //int T;cin>>T;
    //while(T--)
        solve();
    return 0;


AC代码:注意对double得处理 注意开longlong 注意取模!!!

#include<bits/stdc++.h>
#define int long long
#define ll long long
#define endl '\\n'
#define For(i,a,b) for(i=(a);i<=(b);++i)
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
const int N=1e6+5;
const int inf=1e18;
const int mod=1e9+7;
int fac[40];
int qpow(int a,int b)
    int res=1;
    while(b)
    
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    
    return res%mod;

int getinv(int x)return qpow(x,mod-2);
int C(int a,int b)

    return (fac[a]*getinv(fac[a-b])%mod)*getinv(fac[b])%mod;

int n;
void solve()

    cin>>n;
    int g=getinv(24);
    //cout<<g<<endl;
    int ans=((((qpow(n,4)*g%mod+
            qpow(n,3)*6%mod*g%mod))%mod+
            qpow(n,2)*11%mod*g%mod)%mod+
            n*6%mod*g%mod)%mod;
    cout<<ans<<endl;

signed main()

    ios;
    int T;cin>>T;
    while(T--)
        solve();
    return 0;


以上是关于19南京icpc(JG)的主要内容,如果未能解决你的问题,请参考以下文章

2018icpc南京现场赛-G Pyramid(打标找规律+逆元)

2018ICPC南京网络赛

2019.07.042018南京icpc现场赛

ACM-ICPC 2018 南京赛区网络预赛 Magical Girl Haze 最短路

ACM-ICPC 2018 南京赛区网络预赛 E题

2018南京icpc现场赛心得