日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

HDU 4407 sum 容斥原理

發布時間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 4407 sum 容斥原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法:

利用數據1...N的性質,求與P的互質的個數,位運算,容斥定理。。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<string>
#include<math.h>
#include<map>
#include<set>
#include<algorithm>
using namespace std;struct info
{int s,e,p,num;
}seg[1010];struct pinfo
{int id, v, num;   
}p[1010];int factor[1000]; //保存因子 
map<int,int>mp;int gcd( int n, int m )
{return m ? gcd(m, n % m ) : n;    
}//容斥定理求互質之和 
long long cal( int x, int n)
{//分解出x的因子if( x == 0 )return 0;int i,Lim = sqrt( x * 1.0 ), cnt = 0;for( i = 2; i <= Lim; i++){if( x % i == 0 ){factor[++cnt] = i;while( x % i == 0 )x = x / i;   }        }if( x != 1 ){factor[++cnt] = x;      }int mask = 1 << cnt;long long ans = 0;for( int i = 1; i < mask; i++){  int tt = 0, fac = 1, k;for( int j = 0; j < cnt; j++){if( i & (1<<j) ){tt++;fac *=  factor[j+1];}       }//如果是奇數項      if( tt & 1 ){k = n / fac;ans += ( fac + 1LL * fac * k ) * k / 2;}   else{k = n / fac;ans -= ( fac + 1LL * fac * k ) * k / 2;  } }     return ans;   
}int main( )
{int N, M, a, b, c, d, c1, c2, T;scanf("%d",&T);while( T-- ){  scanf("%d%d",&N,&M);c1 = c2 = 0;for( int i = 1; i <= M; i++){scanf("%d",&a);if( a == 1 ){scanf("%d%d%d",&seg[c1].s, &seg[c1].e, &seg[c1].p);seg[c1].num = i;       c1++;}else{scanf("%d%d",&p[c2].id, &p[c2].v);p[c2].num = i;c2++; }              } long long x, y, pans;for( int i = 0; i < c1; i++) //枚舉每一個查詢 
     {x = cal(seg[i].p, seg[i].s-1);y = cal(seg[i].p, seg[i].e);pans = ((1 + seg[i].e * 1LL) * seg[i].e * 1LL / 2 - y ) - (1 + seg[i].s - 1 ) * 1LL * (seg[i].s - 1) * 1LL / 2 + x;mp.clear();for( int j = 0; j < c2; j++){if( p[j].num <  seg[i].num && seg[i].e >= p[j].id && seg[i].s <= p[j].id ){mp[p[j].id] = p[j].v;   }else if( p[j].num > seg[i].num )break;    }map<int,int>::iterator it;for( it = mp.begin(); it != mp.end(); it++){int xx = gcd(seg[i].p, it->second);int yy = gcd(seg[i].p, it->first);if( yy == 1 && xx != 1 )pans -= it->first;else if( yy != 1 && xx == 1 )pans += it->second;      else if( yy == 1 && xx == 1 )pans += it->second - it->first;  } printf("%I64d\n", pans); }}return 0;
}

?

轉載于:https://www.cnblogs.com/tangcong/archive/2012/09/22/2698434.html

總結

以上是生活随笔為你收集整理的HDU 4407 sum 容斥原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。