Problem G. Pyramid ICPC2018 南京站

思路:  考虑到每次必须在o(1)的复杂度下计算出答案,该题肯定就是推出一个关于n的一元几次式。因此打表找规律。

打表后

得到1,5,15,35,70,126,210.. 

作差 4, 10, 20, 35, 56, 84

作差 6, 10, 15, 21, 28

再作差 4,5,6,7

再做差1,1,1,1

共做差四次  因此设  f(n)=a∗n4+b∗n3+c∗n2+d∗n+eAn=a∗n4+b∗n3+c∗n2+d∗n+e 

 求解出系数即可  

 

打表代码:

#include 
using namespace std;
struct Node
{
    double x,y;
}node[10022];

double dist(int x,int y){
    return (node[x].x-node[y].x)*(node[x].x-node[y].x)+(node[x].y-node[y].y)*(node[x].y-node[y].y);
}
int main()
{
    double pp=10;
for(pp=1;pp<=10;pp++){
    int num=1;

    node[1].x=0;node[1].y=(double)(pp)*sqrt(3);
    int i;
    for(i=2;;){
        if(num%2){
            for(int j=1;j<=num;j+=2){
                node[i].x=j;node[i].y=(double)(pp-num)*sqrt(3);
                i++;
                node[i].x=-j;node[i].y=(double)(pp-num)*sqrt(3);
                i++;
            }
        }
        else{
            node[i].x=0;node[i].y=(double)(pp-num)*sqrt(3);
            i++;
            for(int j=2;j<=num;j+=2){
                node[i].x=j;node[i].y=(double)(pp-num)*sqrt(3);
                i++;
                node[i].x=-j;node[i].y=(double)(pp-num)*sqrt(3);
                i++;
            }
        }
        num++;
        if(num==pp+1){
            break;
        }
    }

    int n=i-1;
    for(int i=1;i<=n;i++){
        printf("%lf %lf\n",node[i].x,node[i].y);
    }
    int ans=0;
    for(i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            for(int k=i+1;k<=n;k++){
                if(dist(i,j)==dist(i,k)&&dist(i,k)==dist(j,k)){
                    ans++;
                }
            }
        }
    }
    //printf("%d\n",ans);
}
}

ac代码:



#include
#include
#include 
#include
#define ll long long
#define mod 1000000007
using namespace std;
ll pow_mod(ll a, ll n)
{
    long long ans = 1;
    while(n){
        if(n&1){
            ans = (ans * a) % mod;
        }
        a = (a * a) % mod;
        n >>= 1;
    }
    return ans;
}

int main(){
    ll n,t;
    
    scanf("%lld",&t);
    while(t--){
        scanf("%lld",&n);
        
        ll ans=((((pow_mod(n, 4)+6*pow_mod(n, 3))%mod+11*pow_mod(n, 2))%mod+6*n)%mod)*pow_mod(24, mod-2);
        ans%=mod;
        printf("%lld\n",ans);
    }
    
    return 0;
    
}

 

你可能感兴趣的:(数论基础,杂)