LongInt Bisearch(LL l, LL r, LongInt ls, LongInt rs, LL key)// [ l , r ) { while (l + 1 < r) { ULL mid = (l + r) >> 1; if (key < mid) { r = mid; rs = (rs - ls) / 3 + ls; } else { l = mid; ls = (rs - ls) / 3 + ls; } } return ls; }
LongInt solve(LL n) { if (n < 0) { return0; } if (!n) { return1; } int k = found_pow2(n + 1); LongInt ls = sum[k]; LongInt rs = sum[k + 1]; returnBisearch(pow2[k], pow2[k + 1], ls, rs, n + 1); }
voidinit() { LongInt tmp = 1; for (int i = 0; i < maxn; i++) { sum[i] = tmp; tmp *= 3; } }
intmain() { init(); LL n, m; while (cin >> n >> m) { if (!n && !m) { break; } LongInt ans = solve(m) - solve(n - 1); ans.print(); puts(""); } return0; }
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
intans(int x) {
// cout<<x<<endl ; if (x==-1) return6; if (x==0) return5; if (x==1) return6; if (x==2) return9; if (x==3) return6; if (x==4) return5; if (x==5) return5; if (x==6) return5; if (x==7) return5; if (x==8) return6; }
intisleap(int y) { if ((y%4==0&&y%100!=0) || y%400==0) return366; elsereturn365; }
intfun(int y,int m) { if (m==2) { if ((y%4==0&&y%100!=0) || y%400==0) return29; elsereturn28; } elsereturn month[m]; }
intmain() { int T; scanf("%d",&T); while(T--) { int y; scanf("%d",&y); int day=0; for(int i=1928;i<y;i++) day+=isleap(i); for(int i=1;i<=4;i++) day+=fun(y,i); day+=1; //cout<<day<<' '; cout<<ans(day%7)<<endl; /*switch (day%7) { case 0: }*/ } return0; }
STA 一个对象只能由一个线程访问(通过对象的接口指针调用其方法),其他线程不得访问这个对象,因此对于这个对象的所有调用都是同步了的,对象的状态(也就是对象的成员变量的值)肯定是正确变化的,不会出现线程访问冲突而导致对象状态错误。其他线程要访问这个对象,必须等待,直到那个唯一的线程空闲时才能调用对象。注意:这只是要求、希望、协议,实际是否做到是由COM决定的。如上所说,这个模型很像Windows提供的窗口消息运行机制,因此这个线程模型非常适合于拥有界面的组件,像ActiveX控件、OLE文档服务器等,都应该使用STA的套间。
MTA 一个对象可以被多个线程访问,即这个对象的代码在自己的方法中实现了线程保护,保证可以正确改变自己的状态。这对于作为业务逻辑组件或干后台服务的组件非常适合。因为作为一个分布式的服务器,同一时间可能有几千条服务请求到达,如果排队进行调用,那么将是不能想像的。注意:这也只是一个要求、希望、协议而已。
NA 一个对象可以被任何线程访问,与MTA不同的是任何线程,而且当跨套间访问时(后面说明),它的调用费用(耗费的CPU时间及资源)要少得多。这准确的说都已经不能算是线程模型了,它是结合套间的具体实现而提出的要求,它和MTA不同的是COM的实现方式而已。
这里经常发生误会。前面的CoMarshalInterface所做的列集,是将代理对象的CLSID及一些持久信息(用于初始化代理对象)格式化为一种格式(网络数据描述——Network Data Representation)后放到一个流对象中,可以通过网络(或其他方式)将这个流对象传递到客户机,由客户通过CoUnmarshalInterface从传来的流对象中反还出代理对象的CLSID和初始化用的一些持久信息,生成代理对象并使用持久信息初始化它以用于汇集操作。这就是发生误会的地方——这里的汇集操作不同于上面的汇集操作,其汇集的是接口方法的参数而不是什么CLSID和一些初始化信息。
STA 当一个组件是STA时,它必须同步保护全局变量和静态变量,即对全局变量和静态变量的访问应该用临界段或其他同步手段保护,因为操作全局和静态变量的代码可以被多个STA线程同时执行,所以那些代码的地方要进行保护。比如对象计数(注意,不是引用计数),代表当前组件生成的对象个数,当减为零时,组件被卸载。此变量一般被类厂对象使用,还好ATL和MFC已经帮我们实现了缺省类厂,这里一般不用担心,但自定义的全局或静态变量得自己处理。