zoukankan      html  css  js  c++  java
  • Bzoj 2749: [HAOI2012]外星人 欧拉函数,数论,线性筛

    2749: [HAOI2012]外星人

    Time Limit: 3 Sec  Memory Limit: 128 MB
    Submit: 568  Solved: 302
    [Submit][Status][Discuss]

    Description

     

    aa.gif.bmp

    Input

     

    bb.gif.bmp

    Output

    输出test行,每行一个整数,表示答案。

    Sample Input

    1
    2
    2 2
    3 1

    Sample Output

    3

    HINT

    aa(1).gif.bmp


    Test<=50 Pi<=10^5,1<=Q1<=10^9

    Source

    很好的一道题。

    就是要求能phi出多少个2。。。

    奇数时要加一(就是刚开始的时候变成偶数时要用一次。)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define MAXN 100000
     4 #define LL long long
     5 int prime[10010],phi[MAXN+10],tot,f[MAXN+10];
     6 bool vis[MAXN+10];
     7 int read()
     8 {
     9     int s=0,fh=1;char ch=getchar();
    10     while(ch<'0'||ch>'9'){if(ch=='-')fh=-1;ch=getchar();}
    11     while(ch>='0'&&ch<='9'){s=s*10+(ch-'0');ch=getchar();}
    12     return s*fh;
    13 }
    14 void getEular()
    15 {
    16     int i,j;
    17     phi[1]=1;tot=0;
    18     for(i=2;i<=MAXN;i++)
    19     {
    20         if(vis[i]==false)
    21         {
    22             prime[++tot]=i;
    23             phi[i]=i-1;
    24         }
    25         for(j=1;j<=tot&&prime[j]*i<=MAXN;j++)
    26         {
    27             vis[prime[j]*i]=true;
    28             if(i%prime[j]==0)
    29             {
    30                 phi[prime[j]*i]=prime[j]*phi[i];
    31                 break;
    32             }
    33             phi[prime[j]*i]=phi[prime[j]]*phi[i];
    34         }
    35     }
    36 }
    37 int main()
    38 {
    39     freopen("alien.in","r",stdin);
    40     freopen("alien.out","w",stdout);
    41     int T,i,m,p,q,n;
    42     bool flag;
    43     LL ans;
    44     T=read();
    45     getEular();
    46     memset(f,0,sizeof(f));//f[i]代表i需要phi多少次才能化为1.(也就是等于能phi多少个2.)
    47     f[1]=-1;
    48     for(i=2;i<=MAXN;i++)f[i]=f[phi[i]]+1;
    49     f[1]++;f[2]++;
    50     while(T--)
    51     {
    52         m=read();ans=0;
    53         flag=false;//判断奇数时要加一.
    54         for(i=1;i<=m;i++)
    55         {
    56             p=read();q=read();
    57             if(p==2)flag=true;
    58             ans+=(LL)f[p]*q;
    59         }
    60         if(flag==false)ans++;
    61         printf("%lld
    ",ans);
    62     }
    63     fclose(stdin);
    64     fclose(stdout);
    65     return 0;
    66 }
    View Code
  • 相关阅读:
    理解SetCapture、ReleaseCapture、GetCapture(控制了消息发往哪个窗口,是理解消息的关键)
    Javascript 的addEventListener()及attachEvent()区别分析
    鼠标拖拽
    鼠标右键菜单
    keydown
    一串跟随鼠标的DIV
    event对象和事件冒泡
    发表说说
    文档流
    CSS3 @keyframes 规则
  • 原文地址:https://www.cnblogs.com/Var123/p/5296757.html
Copyright © 2011-2022 走看看